计算二叉树先序中序后序

本文介绍了如何通过已知的两种二叉树遍历顺序来推导出第三种遍历顺序的方法。具体而言,当已知先序遍历和中序遍历的情况下,可以递归地确定后序遍历的顺序。

三序中知道其中两个就可以推出第三个,但前提是我们必须知道中序.因为:

先序和后序给我们提供的信息是一样的--告诉我们谁是根节点

中序则告诉我们左右子树在哪儿


例:已知先序为eacbdgf,中序为abcdefg,求后序

由先序我们知道e为根节点,我们在中序中把左右子树括起来 --(abcd)e(fg)

同样对左子树abcd进行分析,先序为acbd,中序为abcd.--a(bcd)

递归下去就可以了

后序为bdcafge

### 二叉树的非递归遍历算法(使用栈实现) 二叉树的遍历是数据结构中的基础问题,其中、中后序遍历的非递归实现通常借助栈来完成。以下是详细的实现方法代码示例。 #### 非递归遍历 遍历的顺为:访问根节点 -> 遍历左子树 -> 遍历右子树。在非递归实现中,使用栈来保存节点,并按照顺遍历。 ```c void preOrderNonRecursive(TreeNode* root) { if (root == NULL) { return; } // 定义栈并初始化 SeqStack stack; SeqStackInit(&stack); TreeNode* cur = root; while (cur != NULL || !SeqStackEmpty(&stack)) { // 遍历到左子树最底层 while (cur != NULL) { printf("%c ", cur->data); // 访问当前节点 SeqStackPush(&stack, cur); // 将当前节点入栈 cur = cur->lchild; // 移动到左子树 } // 出栈并访问右子树 cur = SeqStackTop(&stack); SeqStackPop(&stack); cur = cur->rchild; } } ``` #### 非递归中遍历 中遍历的顺为:遍历左子树 -> 访问根节点 -> 遍历右子树。同样使用栈来保存节点,确保访问顺正确。 ```c void inOrderNonRecursive(TreeNode* root) { if (root == NULL) { return; } // 定义栈并初始化 SeqStack stack; SeqStackInit(&stack); TreeNode* cur = root; while (cur != NULL || !SeqStackEmpty(&stack)) { // 遍历到左子树最底层 while (cur != NULL) { SeqStackPush(&stack, cur); // 将当前节点入栈 cur = cur->lchild; // 移动到左子树 } // 出栈并访问当前节点 cur = SeqStackTop(&stack); SeqStackPop(&stack); printf("%c ", cur->data); // 访问当前节点 cur = cur->rchild; // 移动到右子树 } } ``` #### 非递归后序遍历 后序遍历的顺为:遍历左子树 -> 遍历右子树 -> 访问根节点。由于需要访问根节点时,其左右子树必须已经处理完毕,因此需要额外的变量来记录上一次访问的节点。 ```c void postOrderNonRecursive(TreeNode* root) { if (root == NULL) { return; } // 定义栈并初始化 SeqStack stack; SeqStackInit(&stack); TreeNode* cur = root; TreeNode* prev = NULL; // 记录上一次访问的节点 while (cur != NULL || !SeqStackEmpty(&stack)) { // 遍历到左子树最底层 while (cur != NULL) { SeqStackPush(&stack, cur); // 将当前节点入栈 cur = cur->lchild; // 移动到左子树 } // 获取栈顶节点 cur = SeqStackTop(&stack); // 判断是否可以访问当前节点 if (cur->rchild == NULL || cur->rchild == prev) { printf("%c ", cur->data); // 访问当前节点 SeqStackPop(&stack); // 出栈 prev = cur; // 更新上一次访问的节点 cur = NULL; // 避免重复遍历左子树 } else { cur = cur->rchild; // 移动到右子树 } } } ``` ### 总结 非递归遍历的核心思想是使用栈来模拟递归调用栈的行为。遍历在入栈时直接访问节点,中遍历在出栈时访问节点,而后序遍历需要额外的逻辑来判断是否左右子树已经处理完毕。通过这些方法,可以在不使用递归的情况下高效地完成二叉树的遍历[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值