6.重建二叉树
来源:互联网 发布:nginx负载均衡测试 编辑:程序博客网 时间:2024/06/05 19:24
#include <iostream>#include <exception>#include <queue>#include <stack>using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder){ //前序遍历的第一个数字是根节点的值 int rootValue = startPreorder[0]; BinaryTreeNode* root = new BinaryTreeNode(); root->m_nValue = rootValue; root->m_pLeft = root->m_pRight = nullptr; //这棵树仅有根节点一个节点 if(startPreorder == endPreorder) { if(startInorder == endInorder && *startPreorder == *endInorder) { return root; } //else // throw std::exception("Invalid input."); } //在中序遍历中找到根节点的值 int* rootInorder = startInorder; while(rootInorder <= endInorder && *rootInorder != rootValue) { ++ rootInorder; } //在中序遍历中没有找到根节点的值 if(rootInorder == endInorder && *rootInorder != rootValue) { //throw std::exception("invalid input."); } int leftLength = rootInorder - startInorder; int* leftPreorderEnd = startPreorder + leftLength; //构建左子树 if(leftLength >0) { root->m_pLeft = ConstructCore(startPreorder+1, leftPreorderEnd, startInorder, rootInorder-1); } //构建右子树 if(leftLength < endPreorder-startPreorder) { root->m_pRight = ConstructCore(leftPreorderEnd+1, endPreorder, rootInorder+1, endInorder); } return root;}BinaryTreeNode* Construct(int* preorder, int* inorder, int length){ return ConstructCore(preorder, preorder+length-1, inorder, inorder+length-1);};//先序遍历void Preorder(BinaryTreeNode* root){ if(root != nullptr) { cout<<root->m_nValue<<" "; Preorder(root->m_pLeft); Preorder(root->m_pRight); }}//中序遍历void Inorder(BinaryTreeNode* root){ if(root != nullptr) { Inorder(root->m_pLeft); cout<<root->m_nValue<<" "; Inorder(root->m_pRight); }}//后续void Postorder(BinaryTreeNode* root){ if(root != nullptr) { Postorder(root->m_pLeft); Postorder(root->m_pRight); cout<<root->m_nValue<<" "; }}//层次遍历void Levelorder(BinaryTreeNode* root){ if(root == nullptr) return; queue<BinaryTreeNode*> nodes; BinaryTreeNode* p = root; nodes.push(p); while(!nodes.empty()) { p = nodes.front(); cout<<p->m_nValue<<" "; nodes.pop(); if(p->m_pLeft != nullptr) nodes.push(p->m_pLeft); if(p->m_pRight != nullptr) nodes.push(p->m_pRight); }}//非递归先序遍历void NPreorder(BinaryTreeNode* root){ if(root == nullptr) return ; stack <BinaryTreeNode*> nodes; nodes.push(root); BinaryTreeNode* pNode = nullptr; while(!nodes.empty()) { pNode = nodes.top(); nodes.pop(); while(pNode) { cout<<pNode->m_nValue<<" "; //先访问左子树上的根 if(pNode->m_pRight) //右子树压栈 nodes.push(pNode->m_pRight); pNode = pNode->m_pLeft; //左子树 } }}//非递归中序遍历void NInorder(BinaryTreeNode* root){ if(root == nullptr) return ; stack<BinaryTreeNode*> nodes; BinaryTreeNode* pNode = root; while(!nodes.empty() || pNode != nullptr) { while(pNode) { nodes.push(pNode); pNode = pNode->m_pLeft; } pNode = nodes.top(); nodes.pop(); cout<<pNode->m_nValue<<" "; pNode = pNode->m_pRight; }}int main(){ int preo[] = {1,2,4,7,3,5,6,8}; int ino[] = {4,7,2,1,5,3,8,6}; BinaryTreeNode* root = Construct(preo, ino, sizeof(preo)/sizeof(preo[0])); cout<<"先序遍历:"; Preorder(root); cout<<endl<<"N先序遍历:"; Preorder(root); cout<<endl<<"中序遍历:"; Inorder(root); cout<<endl<<"N中序遍历:"; NInorder(root); cout<<endl<<"后序遍历: "; Inorder(root); cout<<endl<<"层次遍历: "; Levelorder(root); return 0;}
1 0
- 6. 重建二叉树
- 6.重建二叉树
- 6.重建二叉树
- 剑指offer 6. 重建二叉树
- 面试题6. 重建二叉树
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- Haproxy的安装与配置
- Haproxy配置文件详解
- LVS Nginx HAProxy 优缺点
- 萤石云初始化爬坑1
- ThreadLocal原理
- 6.重建二叉树
- LeetCode 541. Reverse String II
- linux配置防火墙详细步骤(iptables命令使用方法)
- 关于BOM,DOM和window的小复习
- 【二十二】javascript高级技巧
- iptables工具
- 含scrollview公告对话框
- iptables之FORWARD转发链
- BZOJ3435: [Wc2014]紫荆花之恋 动态树分治 替罪羊树