前序、中序、后序。(中序最重要)

本文详细解析了二叉树的三种遍历方式:前序、中序和后序遍历,通过具体实例展示了每种遍历方法的顺序,帮助读者深入理解二叉树结构及其遍历原理。

上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。

上图二叉树遍历结果

    前序遍历:ABCDEFGHK

    中序遍历:BDCAEHGKF

    后序遍历:DCBHKGFEA

https://blog.youkuaiyun.com/qq_33243189/article/details/80222629

二叉树的前序、中后序遍历是信息学奥赛初赛中关于二叉树的重要知识点。 ### 遍历定义 - **前序遍历**:按照“根 - 左 - 右”的顺访问二叉树的节点,即先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。 - **中遍历**:按照“左 - 根 - 右”的顺访问节点,先递归地中遍历左子树,再访问根节点,最后递归地中遍历右子树。 - **后序遍历**:按照“左 - 右 - 根”的顺访问节点,先递归地后序遍历左子树,再递归地后序遍历右子树,最后访问根节点[^1]。 ### 遍历算法及特点 - **后序遍历的复杂性**:后序遍历相对麻烦,在“左右中”的遍历顺下,当遍历到栈顶时,难以判断是从左子树还是右子树返回的。对于叶子节点、右子树为 null 的节点以及从右子树遍历过来的情况,都需要打印当栈顶节点,判断情况较为复杂[^2]。 ### 遍历转换 已知中后序遍历结果,可以求出前序遍历。思路是利用后序遍历的最后一个字符是根节点,在中遍历中找到根节点的位置,将中遍历结果分为左右两个子串,再根据子串长度分割后序遍历列,最后递归求解。以下是两种实现代码示例: ```cpp // 引用[1]代码示例 #include <iostream> #include <string> using namespace std; void dfs(string ldr, string lrd) { int len = lrd.length(); char root = lrd[len - 1]; cout << root; int root_index = 0; for(int i = 0; i < len; i++) { if(ldr[i] == root) { root_index = i; break; } } string ldr_left = ldr.substr(0, root_index); string ldr_right = ldr.substr(root_index + 1, len - root_index - 1); int len_left = ldr_left.length(); int len_right = ldr_right.length(); string lrd_left = lrd.substr(0, len_left); string lrd_right = lrd.substr(len_left, len - len_left - 1); if(len_left > 0) { dfs(ldr_left, lrd_left); } if(len_right > 0) { dfs(ldr_right, lrd_right); } } int main() { string ldr; string lrd; cin >> ldr; cin >> lrd; dfs(ldr, lrd); return 0; } ``` ```cpp // 引用[4]代码示例 #include <bits/stdc++.h> using namespace std; char mid[200], last[200]; void build(int x, int y, int p, int q) { if (x > y || p > q) return; int t = x; while (mid[t] != last[q]) t++; int len = t - x; cout << last[q]; build(x, t - 1, p, p + len - 1); // left build(t + 1, y, p + len, q - 1); // right } int main() { cin >> mid >> last; int size = strlen(mid) - 1; build(0, size, 0, size); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值