剑指offer-树
来源:互联网 发布:网络女神思瑞在哪直播 编辑:程序博客网 时间:2024/06/15 15:05
#include<iostream>#include<algorithm>#include<queue>#include<stack>using namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode *left; BinaryTreeNode *right;};BinaryTreeNode *InsertNode(BinaryTreeNode *left, BinaryTreeNode *right, int data){ BinaryTreeNode *root=new BinaryTreeNode; root->left=left; root->right=right; root->data=data; return root;}//按层次打印二叉树 递归和非递归版本void printByLevel(BinaryTreeNode *root){ queue<BinaryTreeNode *> q; q.push(root); int i=1; while (!q.empty()) { BinaryTreeNode *p = q.front(); q.pop(); cout <<i++<< " "<<p->data << endl; if (p->left) q.push(p->left); if (p->right) q.push(p->right); }}void printByLevelTraverse(BinaryTreeNode *root,int i){ cout << i << ":" << root->data << endl; if (root->left) printByLevelTraverse(root->left,2*i); if (root->right) printByLevelTraverse(root->right,2*i+1);}//先序遍历void PreOrder(BinaryTreeNode *root){ if (root) { cout << root->data << " "; PreOrder(root->left); PreOrder(root->right); }}void PreOrderTraverse(BinaryTreeNode *root){ stack<BinaryTreeNode *> s; BinaryTreeNode *p=root; while (p||!s.empty()) { while (p) { cout << p->data << " "; s.push(p); p=p->left; } if (!s.empty()){ p = s.top(); s.pop(); p=p->right; } } cout<<endl;}//中序遍历void MidOrder(BinaryTreeNode *root){ if (root){ MidOrder(root->left); cout << root->data << " "; MidOrder(root->right); }}//递归中序遍历void MidOrderTraverse(BinaryTreeNode *root){ stack<BinaryTreeNode *> s; BinaryTreeNode *p=root; while (p||!s.empty()) { while (p) { s.push(p); p=p->left; } if (!s.empty()){ p = s.top(); s.pop(); cout << p->data << " "; p=p->right; } } cout<<endl;}//后序遍历void PostOrder(BinaryTreeNode *root){ if (root){ PostOrder(root->left); PostOrder(root->right); cout << root->data << " "; }}void PostOrderTraverse(BinaryTreeNode *root){ BinaryTreeNode *p=root; BinaryTreeNode *q=NULL; stack<BinaryTreeNode *> s; while (p||!s.empty()) { while (p) { s.push(p); p=p->left; } if (!s.empty()){ p = s.top(); if (p->right == NULL||p->right==q){ cout << p->data << " "; q=p; p=NULL; s.pop(); } else{ p=p->right; } } } cout<<endl;}//二叉树的深度int DepthOfBinaryTree(BinaryTreeNode *root){ if (root==NULL) return 0; int l=DepthOfBinaryTree(root->left); int r=DepthOfBinaryTree(root->right); return l>r?l+1:r+1;}//根据前序遍历和中序遍历重建二叉树BinaryTreeNode *ConstructCore(int *startPreOrder, int *endPreOrder, int *startMidOrder, int *endMideOrder){ int rootValue = startPreOrder[0]; BinaryTreeNode *root = new BinaryTreeNode(); root->data=rootValue; root->left=NULL; root->right=NULL; //递归结束条件 if (startPreOrder == endPreOrder){ if (startMidOrder==endMideOrder&&startPreOrder==startMidOrder) return root; else throw exception("inValid input"); } //在中序遍历中找到根结点的值 int *rootInOrder=startMidOrder; while (rootInOrder<=endMideOrder&&*rootInOrder!=rootValue) { ++rootInOrder; } int leftLength=rootInOrder-startMidOrder; int *leftPreOrderEnd=startPreOrder+leftLength; if (leftLength > 0){ //构建左子树 root->left = ConstructCore(startPreOrder+1,leftPreOrderEnd,startMidOrder,rootInOrder-1); } if (leftLength < endPreOrder - startMidOrder){ //构建右子树 root->right = ConstructCore(leftPreOrderEnd+1,endPreOrder,rootInOrder+1,endMideOrder); } return root;}BinaryTreeNode *Construct(int *preOrder, int *midOrder,int n){ if (preOrder==NULL||midOrder==NULL||n<=0) return NULL; return ConstructCore(preOrder,preOrder+n-1, midOrder,midOrder+n-1);}//打印二叉树中和为某一值的路径void PrintTreePathOfTarget(BinaryTreeNode *root, int sum, int target, vector<int> &pathVec){ sum+=root->data; pathVec.push_back(root->data); bool isLeaf = root->left == NULL&& root->right == NULL; if (sum == target&&isLeaf) { for (auto c:pathVec) cout << c << " "; cout<<endl; } if (root->left){ PrintTreePathOfTarget(root->left,sum,target,pathVec); } if (root->right) { PrintTreePathOfTarget(root->right,sum,target,pathVec); } pathVec.pop_back();}//二叉树的镜像void MirrorOfTree(BinaryTreeNode *root){ if (root==NULL) return ; if (root->left==NULL&&root->right==NULL) return; BinaryTreeNode *p = root->left; root->left = root->right; root->right = p; if (root->left) MirrorOfTree(root->left); if (root->right) MirrorOfTree(root->right);}//输入两颗二叉树A和B,判断B是不是A的子结构bool isSubCore(BinaryTreeNode *A, BinaryTreeNode *B){ if (A != NULL&&B != NULL){ if (A->data == B->data){ return isSubCore(A->left,B->left)&&isSubCore(A->right,B->right); } } if (A==NULL&&B==NULL) return true; return false;}bool isSubTree(BinaryTreeNode *A, BinaryTreeNode *B){ bool result=false; if (A->data==B->data) result = isSubCore(A,B); if (!result){ result = isSubTree(A->left,B); } if (!result){ result = isSubTree(A->right,B); }}int main(){ //1.创建二叉树 BinaryTreeNode *n1 = InsertNode(NULL,NULL,1); BinaryTreeNode *n2 = InsertNode(NULL,NULL,7); BinaryTreeNode *n3 = InsertNode(NULL, NULL, 8); BinaryTreeNode *n4 = InsertNode(NULL, NULL, 3); BinaryTreeNode *n5 = InsertNode(n1, n2, 4); BinaryTreeNode *n6 = InsertNode(n3, n4, 5); BinaryTreeNode *root = InsertNode(n5,n6,2); //2.按层次打印二叉树 printByLevel(root); //迭代 printByLevelTraverse(root,1);//递归 //3.先序遍历 PreOrder(root);cout<<endl; PreOrderTraverse(root); //4.中序遍历 MidOrder(root);cout<<endl; MidOrderTraverse(root); //5.后序遍历 PostOrder(root);cout<<endl; PostOrderTraverse(root); //6.返回二叉树的深度 cout << DepthOfBinaryTree(root)<<endl; //7.根据前序遍历和中序遍历重建二叉树 //const int n=7; //int preOrder[n] = {2,4,1,7,5,8,3};//已知前序遍历 //int midOrder[n] = {1,4,7,2,8,5,3};//已知中序遍历 //Construct(preOrder,midOrder,n); //8.打印和为某一值的路径 vector<int> pathVec; PrintTreePathOfTarget(root,0,15,pathVec); //9.二叉树的镜像// MirrorOfTree(root);// printByLevel(root); //10.输入两颗二叉树A和B,判断B是不是A的子结构 BinaryTreeNode *A=root; BinaryTreeNode *B=n5; bool flag= isSubTree(A,B); cout<<flag<<endl; system("pause"); return 0;}
0 0
- 剑指offer 树
- 剑指Offer: 二叉树
- 剑指offer-树
- 剑指offer 树专题
- 剑指offer之树
- <剑指offer>二叉树专题
- [剑指offer]重建二叉树
- <剑指offer>二叉树专题
- 【剑指offer】二叉树深度
- 【剑指offer】重建二叉树
- 剑指offer--重建二叉树
- 剑指offer--平衡二叉树
- 剑指offer---重建二叉树
- 剑指Offer-重建二叉树
- 剑指offer:重建二叉树
- 《剑指offer》平衡二叉树
- 剑指offer-重建二叉树
- 《剑指offer》重建二叉树
- Java并发编程:volatile关键字解析
- java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
- mysql 连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等
- 全世界的webrtc开发者开发者都在吐槽为什么谷歌不能给个小的代码或者包装好的库,而不是几十G的代码!
- #16 Permutations II
- 剑指offer-树
- Codeforces Round #369 (Div. 2) A B 两水题 编码能力
- 机器学习应用场景
- HDU 1043 Eight poj 1077 (八数码 启发式搜索)
- 使用eclipse编程出现Use View.isInEditMode() in your custom views to skip code when shown in Eclipse解决方法
- #14 First Position of Target
- Java动态生成excel表格,动态合并多个单元格
- 用两个队列实现栈&用两个栈实现队列
- #12 Min Stack