一、中序遍历
中序遍历过程:先访问左子节点,然后访问当前节点,最后访问右子节点。
以下试一次中序遍历过程:

二、非递归实现
非递归方式遍历依赖栈来实现,因为要先访问子节点,然后访问父节点,因此必须要有一个数据结构来保存已经父节点。
实现原理:
- 每次遍历到一个节点,不访问它,先压栈,然后对左子树循环做这个操作。
- 遍历左节点直到左节点为空时,取出栈顶元素,访问它。
- 然后对这个栈顶元素的右节点重复执行第一个步骤。
大致的逻辑和前序遍历差不多,相对于前序遍历而言,中序遍历知识把访问节点的时机延后了一些。前序遍历可以参考二叉树的先序遍历。
代码描述:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* * 中序遍历的非递归实现 * @node 需要遍历的节点 * @v 保存遍历结果的数组 */ void in_order_traversal_by_stack(tree_node<T> *node, vector<T> &v) { stack<tree_node<T> *> st; tree_node<T> *p; p = node; while (p || !st.empty()) { // 左子树压栈 while (p) { st.push(p); p = p->lchild; } if (!st.empty()) { // 取出栈顶元素 p = st.top(); st.pop(); // 访问节点 v.push_back(p->data); // 设置指针为右子节点 p = p->rchild; } } } |
三、递归实现
递归实现很简单,不做详细描述:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* * 中序遍历的递归实现 * @node 需要遍历的节点 * @v 保存遍历结果的数组 */ void in_order_traversal(tree_node<T> *node, vector<T> &v) { if (node == nullptr) return; if (node->lchild) in_order_traversal(node->lchild, v); v.push_back(node->data); if (node->rchild) in_order_traversal(node->rchild, v); } |



![[leetcode]226-翻转二叉树](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/02/cff55-image8d13f59af4ceb4d0.png&w=280&h=210&a=&zc=1)

![[leetcode]199-二叉树的右视图](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/04/f24a8-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]72-编辑距离](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/04/88c60-imageff84a6c5047db6ed.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]460-LFU缓存](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/04/5b3f2-image.png&w=280&h=210&a=&zc=1)
![[leetcode]125-验证回文串](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/5bfa5-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[程序员面试宝典]17.16-按摩师](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/9ecc9-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]876-链表的中间节点](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/64d0d-imagece778ab033c9d90d.png&w=280&h=210&a=&zc=1)
![【每日打卡】[剑指offer]面试题40-最小的k个数](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/c83c9-imagec745c425c670e18c.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]-409最长回文子串](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/e5589-image788d511d7c1e839c.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]面试题1.6-字符串压缩](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/776bc-image.png&w=280&h=210&a=&zc=1)
![[leetcode]145-二叉树的后序遍历](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/02/ce5a3-image6343ae7c83fc33ae.png&w=280&h=210&a=&zc=1)

![[leetcode]94-二叉树的中序遍历](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/02/8b76b-imagee456f6b50ae11301.png&w=280&h=210&a=&zc=1)
评论