二叉树面试题—前,中,后序(非递归),判断是否为完全二叉树
来源:互联网 发布:javascript拼图教程 编辑:程序博客网 时间:2024/06/05 08:58
二叉树的基本操作
Node* GetParent(Node* x) //得到父节点 { if ( _pRoot == NULL) return _pRoot; return _GetParent(_pRoot, x); } Node* Find(const T& value) //查找结点 { return _FindNode(_pRoot, value); } size_t Hight() //求树的高度 { return _Hight(_pRoot); } size_t GetLeefNode() //求叶子节点的个数 { return _GetLeefNode(_pRoot); } size_t GetLevelNode(size_t k) //求第K层节点的个数 { return _GetLevelNode(_pRoot,k); } void PreOrder_Nor() //前序遍历(不用递归) { if (_pRoot) _PreOrder_Nor(_pRoot); } void InOrder_Nor() //中序遍历(不用递归) { if (_pRoot) _InOrder_Nor(_pRoot); } void PostOrder_Nor() //后序遍历(不用递归) { if (_pRoot) _PostOrder_Nor(_pRoot); } void GetBinaryMirror() //求二叉树的镜像 { if (_pRoot) _GetBinaryMirror(_pRoot); } void GetBinaryMirror_Nor() //求二叉树的镜像(非递归) { if (_pRoot) _GetBinaryMirror(_pRoot); } bool isCompleteBinaryTree() //判断是否为完全二叉树 { if (_pRoot) { queue<Node*> q; q.push(_pRoot); bool isComplete = true; while (!q.empty()) { Node* Front = q.front(); q.pop(); if (!isComplete && (Front->_pLeft || Front->_pRight)) { return false; } if (Front->_pLeft) q.push(Front->_pLeft); if (Front->_pRight) q.push(Front->_pRight); else { isComplete = false; } } return true; } return false; }
Node* _GetParent(Node* proot, Node* x) { if (proot->_pLeft == x || proot ->_pRight == x) return proot; if (proot->_pLeft == NULL || proot->_pRight == NULL) return NULL; Node* Temp = _GetParent(proot->_pLeft, x); if (Temp == NULL) { Temp = _GetParent(proot->_pRight, x); } return Temp; } Node* _FindNode(Node* proot, const T& value) { if ( proot == NULL || proot->_value == value) return proot; Node* Temp = _FindNode(proot->_pLeft,value); if (Temp == NULL) { Temp = _FindNode(proot->_pRight, value); } return Temp; } size_t _Hight(Node* proot) { if (proot == NULL) return 0; size_t LeftHight = 1+_Hight(proot->_pLeft); size_t RightHight = 1+_Hight(proot->_pRight); return (LeftHight>RightHight)?LeftHight:RightHight; } size_t _GetLeefNode(Node* proot) { if (proot == NULL) return 0; if (proot->_pLeft == NULL && proot ->_pRight == NULL) return 1; size_t LeftLeefNode = _GetLeefNode(proot->_pLeft); size_t RightLeefNode = _GetLeefNode(proot->_pRight); return (LeftLeefNode+RightLeefNode); } size_t _GetLevelNode(Node* proot, size_t k) { size_t h = _Hight(proot); if (k == 1) return 1; if ( proot == NULL || k> h ) return 0; size_t LeftLevelNode = _GetLevelNode(proot->_pLeft,k-1); size_t RightLevelNode = _GetLevelNode(proot->_pRight,k-1); return (LeftLevelNode+RightLevelNode); } void _PreOrder_Nor(Node* proot) { cout<<"前序:"; stack<Node*> st; st.push(proot); while (!st.empty()) { Node* temp = st.top(); cout<<temp->_value<<"->"; st.pop(); if ( temp->_pRight ) st.push(temp->_pRight); if ( temp->_pLeft ) st.push(temp->_pLeft); } cout<<"end"<<endl; } void _InOrder_Nor(Node* proot) { cout<<"中序:"; stack<Node*> st; Node* temp = proot; while ( temp || !st.empty() ) { while (temp) { st.push(temp); temp = temp->_pLeft; } Node* Top = st.top(); st.pop(); cout<<Top->_value<<"->"; temp = Top->_pRight; } cout<<"end"<<endl; } void _PostOrder_Nor(Node* proot) { cout<<"后序:"; stack<Node*> st; Node* pCur = proot; Node* pPre = NULL; while ( pCur || !st.empty() ) { while (pCur) { st.push(pCur); pCur = pCur->_pLeft; } pCur = st.top(); if ( pCur->_pRight == NULL || pCur ->_pRight == pPre) { cout<<pCur->_value<<"->"; st.pop(); pPre = pCur; pCur = NULL; } else pCur = pCur->_pRight; } cout<<"end"<<endl; } void _GetBinaryMirror(Node* &proot) { if (proot == NULL) return; if (proot ->_pLeft || proot->_pRight ) swap(proot->_pLeft, proot->_pRight); _GetBinaryMirror(proot->_pLeft); _GetBinaryMirror(proot->_pRight); } void _GetBinaryMirror_Nor(Node* &proot) { queue<Node*> q; q.push(proot); while(!q.empty()) { Node* pCur = q.front(); q.pop(); std::swap(pCur->_pLeft, pCur->_pRight); if (pCur->_pLetf) q.push(pCur->_pLetf); if (pCur->_pRight) q.push(pCur->_pRight); } }
1 0
- 二叉树面试题—前,中,后序(非递归),判断是否为完全二叉树
- 【经典面试题二】二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树镜像(递归和非递归)+ 判断一棵二叉树是否是平衡二叉树+ 判断一棵树是否为完全二叉树
- Java实现完全二叉树,实现非递归前序,中序,后序遍历
- 二叉树面试题-镜像与判断是否为完全二叉树
- 二叉树非递归前、中、后序遍历
- 二叉树非递归前、中、后序遍历实现
- 二叉树的非递归【前/中/后 序遍历】
- 非递归前,中,后序遍历二叉树
- 二叉树非递归遍历 (前,中,后) c
- 以二叉链表的方式创建一棵二叉树,并以非递归算法中序输出;计算二叉树的繁茂度,并判断二叉树是否为完全二叉树
- 【面试题】剑指offer24--判断一个序列是否为二叉树的后序遍历
- 二叉树面试题:判断树是否为完全二叉树和求二叉树的镜像
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 数据结构面试题/判断一棵树是否是完全二叉树
- 接前-后序遍历二叉树(非递归)
- 面试题 二叉树的前序遍历,中序遍历,后序遍历(递归实现)
- 二叉树:前序,后序,中序遍历(递归+非递归);层次(队列)
- jxls 多个sheet 生成
- 抓包工具 mitmproxy 与Charles使用简介 POST
- Codeforces Round #411(Div. 2)D. Minimum number of steps【思维递推+快速幂】
- MyEclipse 编码方式改变
- 关于获取属性文件的内容
- 二叉树面试题—前,中,后序(非递归),判断是否为完全二叉树
- 消解算法
- mysql服务启动、停止、重启
- 知识总结之 插件化基础ClassLoader
- 欧拉函数
- ENC28J60稳定可靠么?
- Java对话框实现字符串反转,字符串大小写转换的程序实现
- 在cmd的命令下 用Mysql中建立一个表
- 网络编程之Volley解析