二叉树的各种遍历
来源:互联网 发布:网络盈利模式 编辑:程序博客网 时间:2024/06/05 19:50
// 前序:访问根节点--->访问根节点的左子树--->访问根节点的右子树 void _PreOrder(Node* pRoot) { if (pRoot) { cout << pRoot->_value << " "; _PreOrder(pRoot->_pLeft); _PreOrder(pRoot->_pRight); } } //前序遍历非递归 void _PreOrder_Nor(Node*pRoot) { if (NULL == pRoot) return; stack<Node*>s; s.push(pRoot); while (!s.empty()) { Node*pCur = s.top(); cout << pCur->_value << " "; s.pop(); if (pCur->_pRight) s.push(pCur->_pRight); if (pCur->_pLeft) s.push(pCur->_pLeft); } } //中序遍历递归 void _InOrder(Node* pRoot) { if (pRoot) { _InOrder(pRoot->_pLeft); cout << pRoot->_value << " "; _InOrder(pRoot->_pRight); } } //中序遍历非递归 void _InOrder_Nor(Node*pRoot) { if (NULL == pRoot) return; stack<Node*>s; Node*pCur = pRoot; while (pCur || !s.empty()) { while (pCur) { // 找到最左边的孩子,并把所经过路径的结点保存下来 s.push(pCur); pCur = pCur->_pLeft; } //出了内层循环,pCur为空,栈顶元素为最左边的孩子 pCur = s.top(); cout << pCur->_value << " "; s.pop(); pCur = pCur->_pRight; } } // 后序遍历:遍历根的左子树-->遍历根的右子树-->遍历根节点 void _PostOrder(Node* pRoot) { if (pRoot) { _PostOrder(pRoot->_pLeft); _PostOrder(pRoot->_pRight); cout << pRoot->_value << " "; } } //后序遍历非递归 void _PostOrder_Nor(Node*pRoot) { if (NULL == pRoot) return; stack<Node*>s; Node*pCur = pRoot; Node*Prev = NULL;//保存上次入栈的结点 while (pCur || !s.empty()) { while (pCur) { // 找到最左边的孩子,并把所经过路径的结点保存下来 s.push(pCur); pCur = pCur->_pLeft; } Node*pTop = s.top(); if (NULL == pTop->_pRight || Prev == pTop->_pRight)//没有Prev == pTop->_pRight会4256666666......会死循环下去 { //Prev == pTop->_pRight右已经访问过了,才能访问当前的根 //NULL == pTop->_pRight cout << pTop->_value << " "; Prev = pTop; //保存上次入栈的结点 s.pop(); } else { pCur = pTop;//pCur在while出来之后为NULL,所以要更新pCur的值,少了这句,崩溃 pCur = pCur->_pRight;//将右子树当做一颗新的树去访问 } } } // 层序遍历 void _LevelOrder(Node*pRoot)//******考点********队列*** { if (NULL == pRoot) return; queue<Node*>q; q.push(pRoot);//保存的是结点的地址,地址出了队列,但是树并没有改变 while (!q.empty()) { Node*pcur = q.front(); cout << pcur->_value << " "; if (pcur->_pLeft)//左不为空入队列 { q.push(pcur->_pLeft); } if (pcur->_pRight)//右不为空入队列 { q.push(pcur->_pRight); } q.pop(); } cout << endl; }
阅读全文
1 0
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树各种遍历
- 二叉树各种遍历
- 二叉树各种遍历
- 二叉树的各种遍历,二叉树改链表,二叉树复习
- 二叉树的各种遍历【hao】
- 二叉树的各种遍历算法
- 遍历二叉树的各种实现
- 二叉树遍历的各种方式
- 二叉树的构建及各种遍历
- 二叉树遍历的各种算法
- 二叉树的各种非递归遍历
- 算法 二叉树的各种遍历
- Java之JVM逃逸分析
- Bluetooth MESH探究 --- (3) BLE core spec之物理层
- 微信公众号测试生产环境分离实践
- 生产/消费模式实现
- JS的十大经典算法排序
- 二叉树的各种遍历
- HDU 6044 Limited Permutation dfs + 组合数(读入挂)
- Python学习——动态类型简介
- 创建守护进程
- Leetcode-20:Valid Parentheses
- 碰撞检测
- Makefile.am Makefile.in Makefile与AutoMake关系
- JQuery语法规则
- webview无法弹出select选择框