层序+中序 = 二叉树
先序+中序 = 二叉树。
pre[n]存放先序序列,in[n]存放中序序列。
一,递归边界:中序序列的左边界必须小于等于右边界。
二,递归:
1,取当前先序序列[preL,preR]的第一个元素pre[preL]作为根节点root,
2,在当前中序序列中找出根节点root的下标k,把当前中序序列划分为[inL,k-1],[k+1,inR],分别是 当前根节点root的 左子树的中序序列,和右子树的中序序列。
3,根据左子树的结点个数,可以把当前 先序序列 划分成 当前根节点root的 左子树的先序序列,和右子树的先序序列。
结合步骤,直接看代码。
1 //当前二叉树的 先序区间[preL,preR], 中序区间[inL,inR] 2 Node* create(int preL,int preR,int inL,int inR) { 3 //第一步,确定递归边界 4 if(inL > inR) return NULL; 5 //第二步,保存当前根结点 6 Node* root = new Node; 7 root->data = pre[preL]; 8 //第三步,用根结点划分中序,求出根节点左子树结点的个数 9 int k,leftNum; 10 for(k = inL; k <= inR; ++k) 11 if(in[k] == pre[preL]) break; 12 leftNum = k - inL; 13 //第四步,确定左子树的后序、中序, 右子树的后序,中序 14 root->lchild = create(preL+1,preL+leftNum,inL,k-1);//红色部分是先序序列,绿色部分是中序序列 15 root->rchild = create(preL+leftNum+1,preR,k+1,inR); 16 return root; 17 }
后序+中序 = 二叉树。
post[n]存放后序序列,in[n]存放中序序列。
一,递归边界:中序序列的左边界必须小于等于右边界。
二,递归:
1,取当前后序序列[postL,postR]的最后一个元素post[postR]作为根节点root,
2,在当前中序序列中找出根节点root的下标k,把当前中序序列划分为[inL,k-1],[k+1,inR],分别是 当前根节点root的 左子树的中序序列,和右子树的中序序列。
3,根据左子树的结点个数,可以把当前 后序序列 划分成 当前根节点root的 左子树的后序序列,和右子树的后序序列。
结合步骤,直接看代码。
1 //当前二叉树的 后序区间[postL,postR], 中序区间[inL,inR] 2 Node* create(int postL,int postR,int inL,int inR) { 3 //第一步,确定递归边界 4 if(inL > inR) return NULL; 5 //第二步,保存当前根结点 6 Node* root = new Node; 7 root->data = post[postR]; 8 //第三步,用根结点划分中序,求出根节点左子树结点的个数 9 int k,leftNum; 10 for(k = inL; k <= inR; ++k) 11 if(in[k] == post[postR]) break; 12 leftNum = k - inL; 13 //第四步,确定左子树的后序、中序, 右子树的后序,中序 14 root->lchild = create(postL,postL+leftNum-1,inL,k-1); 15 root->rchild = create(postL+leftNum,postR-1,k+1,inR); 16 return root; 17 }
层序+中序 = 二叉树。
level[n]存放先序序列,in[n]存放中序序列。
一,递归边界:中序序列的左边界必须小于等于右边界。
二,递归:
1,找到当前层序序列中 第一个 出现在当前中序序列的元素 作为根节点root,
2,在当前中序序列中找出根节点root的下标k,把当前中序序列划分为[inL,k-1],[k+1,inR],分别是 当前根节点root的 左子树的中序序列,和右子树的中序序列。
结合步骤,直接看代码。
1 //当前二叉树的 层序区间[levelL,levelR], 中序区间[inL,inR] 2 Node* create(int levelL,int levelR,int inL,int inR) { 3 //第一步,确定递归边界 4 if(inL > inR) return NULL; 5 //第二步,找到当前层序序列中 第一个 出现在当前中序序列的元素 作为根节点root 6 Node* root = new Node; 7 int k,flag = 0; 8 for( ; levelL <= levelR; ++levelL) {//当前层序序列[levelL,levelR] 9 for(k = inL; k <= inR; ++k) {//当前中序序列 [inL,inR] 10 if(in[k] == level[levelL]) { 11 flag = 1; //找到! 12 break; 13 } 14 } 15 if(flag == 1) break; 16 } 17 root->data = level[levelL]; 18 //第三步,确定当前根节点的左子树的层序序列 和中序序列,右子树的层序序列 和中序序列 19 root->lchild = create(levelL+1,levelR,inL,k-1); 20 root->rchild = create(levelL+1,levelR,k+1,inR); 21 return root; //总是忘记这个小可爱~~ 22 }
输入样例:
7
4 1 6 3 5 7 2
1 2 3 4 5 6 7
输出样例:
4 1 3 2 6 5 7 //先序序列
直接上代码。。。
#include<iostream> #include<algorithm> using namespace std; const int maxn = 100; struct Node { int data; Node* lchild; Node* rchild; }; int level[maxn],in[maxn];//层序、中序序列 int n;//结点个数 int num = 0;//已经访问的结点个数 void preorder(Node* root) { //先序遍历 if(root == NULL) return ; if(num > 0) printf(" "); cout<<root->data; num++; preorder(root->lchild);//访问左子树,两个选择分支 preorder(root->rchild);//访问右子树 } //当前二叉树的 层序区间[levelL,levelR], 中序区间[inL,inR] Node* create(int levelL,int levelR,int inL,int inR) { //第一步,确定递归边界 if(inL > inR) return NULL; //第二步,找到当前层序序列中 第一个 出现在当前中序序列的元素 作为根节点root Node* root = new Node; int k,flag = 0; for( ; levelL <= levelR; ++levelL) {//当前层序序列[levelL,levelR] for(k = inL; k <= inR; ++k) {//当前中序序列 [inL,inR] if(in[k] == level[levelL]) { flag = 1; //找到! break; } } if(flag == 1) break; } root->data = level[levelL]; //第三步,确定当前根节点的左子树的层序序列 和中序序列,右子树的层序序列 和中序序列 root->lchild = create(levelL+1,levelR,inL,k-1); root->rchild = create(levelL+1,levelR,k+1,inR); return root; //总是忘记这个小可爱~~ } int main() { cin>>n; for(int i = 0; i < n; ++i) cin>>level[i]; for(int i = 0; i < n; ++i) cin>>in[i]; Node* root = create(0,n-1,0,n-1); preorder(root); return 0; }
运行结果:


浙公网安备 33010602011771号