題目:已知某二叉樹的前序遍歷序列與中序便利序列,請重建該二叉樹。假設前序遍歷序列與中序遍歷序列的結果中不包含重複數字。
前序遍歷序列:
中序遍歷序列:
前序遍歷就是:根節點——>左子樹——>右子樹,所以我們可以知道前序遍歷序列中的第乙個元素就是根節點root
中序遍歷就是:左子樹——>根節點——>右子樹,由於在前序遍歷序列中已經找到了根節點root,我們在中序遍歷序列中找與根節點值相同的節點,找到之後根節點左面的序列就是左子樹,根節點右面的序列就是右子樹
假如在中序遍歷序列中根節點左面有m個元素,則在前序遍歷序列中根節點之後的m個元素就是左子樹(按上面的步驟遞迴處理該子樹),之後就全部是右子樹(處理方法同左子樹)
package com.cn;
//二叉樹結點
class node
public
node(int
value)
public
node(int
value, node lefttree, node righttree)
public
intgetvalue()
public
void
setvalue(int
value)
public node getlefttree()
public
void
setlefttree(node lefttree)
public node getrighttree()
public
void
setrighttree(node righttree)
}public
class buildtwoforktree ;
int midpreorder = new
int;
node root = buildtree(startpreorder,0,startpreorder.length - 1,midpreorder,0,midpreorder.length-1);
printtree(root);
}//根據前序遍歷序列及中序遍歷序列建立二叉樹
public
static node buildtree(int a,int starta,int enda,int b,int startb,int endb)
node root = new node(a[starta]);
// 在中序遍歷序列中尋找根節點
int i = startb;
for(;i <= endb;i++)
//根節點往左是左子樹,定義左子樹的長度
int offset = i - startb;
//左子樹
root.lefttree = buildtree(a,starta+1,starta+offset,b,startb,startb + offset-1);
//右子樹
root.righttree = buildtree(a,starta+offset+1,enda,b,startb+offset+1,endb);
return root;
}//遞迴輸出二叉樹的前序遍歷
public
static
void
printtree(node root)
system.out.print(root.value + " ");
printtree(root.lefttree);
printtree(root.righttree);
}//非遞迴輸出二叉樹的前序遍歷
public
static
void
printtree1(node root)
}
二叉樹 重建二叉樹
問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...
二叉樹 重建二叉樹
題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...
二叉樹重建
摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...