二叉树的三种遍历
2016-09-08 11:26
113 查看
二叉树的三种遍历:前序、中序、后序。包括递归和非递归的
前序遍历:root节点在最前。root节点、左子节点,右子节点
递归:
非递归:
中序遍历:root在中间。左子节点、root节点、右子节点
递归:
非递归:
后序遍历:root在最后。左子节点、右子节点、root节点。
递归:
非递归:
观察可以发现,对于递归的解法,三种遍历很相似,唯一的不同点就是,输出节点的位置。
前序遍历:输出节点在最前面。中序遍历:输出节点在中间。后序遍历:输出节点在最后。
对于非递归则是用栈来实现。首先判断节点是否为空。最终要的是判断循环条件。如果条件不正确,事倍功半
前序遍历:root节点在最前。root节点、左子节点,右子节点
递归:
//前序递归 void preOrder1(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; //root的输出在最前面 preOrder1(root->left); preOrder1(root->right); }
非递归:
//前序非递归 void preOrder2(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> stk; while (root != NULL || !stk.empty()) { while (root != NULL) { stk.push(root); cout << root->val << " "; // root的输出在前面 root = root->left; } if (!stk.empty()) { root = stk.top(); stk.pop(); root = root->right; } } }
中序遍历:root在中间。左子节点、root节点、右子节点
递归:
//中序递归 void midOrder1(TreeNode* root) { if (root == NULL) return; midOrder1(root->left); cout << root->val << " "; //root的输出在中间 midOrder1(root->right); }
非递归:
//中序非递归 void midOrder2(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> stk; while (root != NULL || !stk.empty()) { while (root != NULL) { stk.push(root); root = root->left; } if (!stk.empty()) { root = stk.top(); cout << root->val << " "; //root输出在中间,无左子节点后 stk.pop(); root = root->right; } } }
后序遍历:root在最后。左子节点、右子节点、root节点。
递归:
//后序递归 void postOrder1(TreeNode* root) { if (root == NULL) return; postOrder1(root->left); postOrder1(root->right); cout << root->val << " "; //root的输出在最后 }
非递归:
//后序非递归 void postOrder2(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> stk; stk.push(root); TreeNode* pre = NULL; TreeNode* cur = NULL; while (!stk.empty()) //root!=NULL??最后一步时,root!=NULL但是程序已结束,变的的cur 不是root { cur = stk.top(); if ((cur->left == NULL && cur->right == NULL) || (pre != NULL && (pre == cur->left || pre == cur->right))) ////如果当前结点没有孩子结点或者孩子节点都已被访问过 { cout << cur->val << " "; pre = cur; stk.pop(); } else { if (cur->right) stk.push(cur->right); if (cur->left) stk.push(cur->left); } } }
观察可以发现,对于递归的解法,三种遍历很相似,唯一的不同点就是,输出节点的位置。
前序遍历:输出节点在最前面。中序遍历:输出节点在中间。后序遍历:输出节点在最后。
对于非递归则是用栈来实现。首先判断节点是否为空。最终要的是判断循环条件。如果条件不正确,事倍功半
相关文章推荐
- Java写的一个二叉树三种遍历递归算法(仅用作理解三种遍历)
- 二叉树的三种非递归遍历
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的三种遍历的非递归实现
- 【转】二叉树的三种遍历的相互转化——已知先序中序求后序
- 二叉树的三种遍历(递归)
- 层次遍历二叉树-三种不同的方法
- 二叉树三种遍历方式的递归和循环实现
- 二叉树的三种迭代遍历方法
- 二叉树的三种遍历算法 源码
- C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)
- 二叉树前序、中序、后序三种遍历的非递归算法
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 【Java】二叉树三种遍历的递归实现
- [心得]二叉树的三种遍历
- 二叉树三种顺序遍历板子
- Java学习(十八):二叉树的三种递归遍历
- 二叉树三种遍历的非递归算法
- 二叉树三种遍历的非递归实现
- HDU 1710 二叉树三种遍历