我不理解预订遍历中的递归
void preorder(node*root)
{
if(root==NULL) return;
printf("%c",root->data);
preorder(root->left);
preorder(root->right);
}
以下是迭代:
序(200) - >预购(150) - >预购(400) - >预购(250) - >预购(0)
即preorder(root-> left)为NULL,返回下一条指令 - >预购(0)
即preorder(root-> right)为NULL,返回
现在我的问题是为什么在这一步之后遍历结束我不理解递归可以有人解释一步一步迭代后这一步递归似乎很简单但在实现中它非常复杂。
ROOT[200]
200 F
/ \
/ \
150 C 350 D
/ \ / \
/ \ / \
400 E 450 F 60 G 700 H
/ \ \
/ \ \
250 A 180 B 600 K
答案 0 :(得分:3)
考虑到您上面提到的代码和树,我会为您简化它。
void preorder(node*root)
{
if(root==NULL) return;
printf("%c",root->data);
preorder(root->left);
preorder(root->right);
}
ROOT[200]
200 F
/ \
/ \
150 C 350 D
/ \ / \
/ \ / \
400 E 450 F 60 G 700 H
/ \ \
/ \ \
250 A 180 B 600 K
迭代是这样的:
preorder(200)
preorder(200->Left) i.e. preorder(150) ---preorder(200->Right)--Pending In Stack-
preorder(150->Left) i.e. preorder(400) ---preorder(150->Right)--Pending In Stack-
preorder(400->Left) i.e. preorder(250) ---preorder(400->Right)--Pending In Stack-
preorder(250->Left) i.e. preorder(NULL)---preorder(250->Right)--Pending In Stack-
传递NULL后,它将返回。并且将执行堆栈中待处理的下一个元素。
// In our case the function being called was
preorder(250)
{
preorder(250->Left); // It returned.
preorder(250->Right); // Next Statement Pending in Stack.
}
以下是堆栈中待处理的语句:
预购(200->右) - 待定堆叠 -
预订(150->右) - 待定堆叠 -
预购(400->右) - 待定堆叠 -
预购(250->右) - 待定堆叠 -
按照订单。堆栈中的Next语句将是:
preorder(250->Right) i.e. preorder(NULL)--preorder(400->Right)--Pending In Stack-
预购(400->右)是该功能的一部分:
preorder(400)
{
preorder(400->Left); // 250
preorder(400->Right);
}
现在,因为400->左,即250已经完成了两者 - > (250->左)和(250->右)。它会将控制返回到(400->右)
类似地,递归将继续进行,直到遍历整个树。我知道一开始很难理解,但不要放松精神。从基本的递归开始,尝试自己提出解决方案。
答案 1 :(得分:0)
return
语句结束当前函数的执行并将控制权返回给调用函数;在电话后的下一个点继续执行。它不会自动地结束调用函数的执行。