#include"iostream
"#include
"queue
"using
namespace
std;
int x[1000],z[1000
];struct
tree;
void xzcreate(tree* &t,int xl,int zl,int len)
for(int i = 0;z[i + zl] != x[xl];i++); //
首先在中序中找到根結點,先序第乙個結點就是根結點,所以有z[i + zl] != x[xl]
if(i >= len)
//建立根節點
t = new
tree;
t->data = z[i +zl];
t->left =null;
t->right =null;
int lenl = i; //
左子樹長度就是i遍歷的長度
int lenr = len - lenl - 1; //
右子樹長度為 : 總長度 - 左子樹長度 - 根結點
//中序的左子樹起點從最左開始,所以還是它本身
xl = xl + 1; //
先序中:左子樹起點 = 右子樹起點 + 根結點, 跳過根節點即是左子樹起點
int zr = lenl + zl + 1; //
中序中:右子樹起點 = 左子樹起點 + 左子樹長度 + 根結點
int xr = xl + lenl; //
先序中:右子樹起點 = 左子樹起點 + 左子樹長度
//cout<<"lenl:"遞迴建樹
if(lenl != 0
)
if(lenr != 0)}
void show(tree* &t)}//
層次遍歷
void sqshow(tree *t)
if(p->right)
q.pop();
}cout
<}int
main()
for(i = 0;i < num;i++)
xzcreate(t,
0,0,num);
sqshow(t);
return0;
}/*1 2 4 5 3 6 7
4 2 5 1 6 3 7
*/
通過中序和先序 後序序列建立二叉樹
在二叉樹的相關題目中,我們經常會碰到這樣的問題,給出一顆二叉樹的前序遍歷和中序遍歷,或者是給出它的後序遍歷和中序遍歷,讓我們畫出這個二叉樹或者是用 實現如何用上面兩種情況來建立這個二叉樹。首先我們來看看給出先序遍歷序列和中序遍歷序列如何畫出這顆二叉樹 首先,先序遍歷序列中的第乙個字母肯定是這顆二叉樹...
二叉樹建立(先序)
建立二叉樹可根據輸入乙個串先序 中序或後序建立,如本篇中以1 2 4 1 1 1 3 5 1 1 1為例,數字 1為空結點,先序 中序 後序沒什麼太大區別,僅僅時對結點資料賦值的時間不同,建立運用遞迴思想。遍歷可先 中 後序,也可層序遍歷。層序遍歷可以運用佇列,每pop出乙個資料,push進相應的左...
先序建立二叉樹及先序 中序 後序遍歷
先序二叉樹 先序建立二叉樹 void createbitree bitree t t bitnode malloc sizeof bitnode t data cnt t lchild null t rchild null createbitree t lchild createbitree t r...