Java由先序序列和中序序列還原二叉樹

2021-09-22 17:33:56 字數 2145 閱讀 3692

還原本來的二叉樹並不是乙個非常簡單的事,雖然思想比較簡單,但過程卻是比較繁瑣。下面我拿先序序列和中序序列來講一下原理吧。

從先序序列中我們一下子就可以得到二叉樹的根節點是第乙個元素,然後再中序序列中我們也可以找到這個元素(假設二叉樹中所有的元素的值不相同)這樣我們就可以把中序序列分成兩部分,前部分和先序序列可求得左子樹,後部分與先序序列可求得右子樹。下面以左部分為例,在除去根節點的前序序列中的第二個元素,就是我們左子樹的的第乙個節點,然後繼續在中序序列的前部分中找到相同的元素,再次對中序序列進行分割。····最後我們就可以得到恢復的二叉樹了。

純文字的講述不太容易理解,下面我拿個具體的例子來分析吧。

比如

int preorder = ;  //前序序列

int inorder = ; //中序序列

我們很容易在前序序列中得知7是根節點,接下來我們在中序序列中找到7所在的位置,那麼此時4,10,3,1便是左子樹對應的所有的節點。11,8,2是右子樹所對應的所有的節點。

然後我們在前序序列中找到除根節點以外的第乙個節點,那就是10,所以這就是左子樹的第乙個節點。然後我們在中序序列中找到10在第二個位置上,而10的左邊有乙個元素4,右邊有3,1兩個節點。這就說明4是節點10的左孩子節點,3,1為節點10的右子樹上面的節點,然後再前序序列中我們便可以看出3是10的左孩子節點,而3的左邊沒有元素,說明3美譽哦左孩子節點,3的右邊有乙個元素1,說明3只有右孩子節點。至此,你是不是也掌握了恢復二叉樹的方法了呢?

原理其實並不難理解,但是**卻不是特別好寫。所以我拷貝了其他人做好的乙份**,大家一起欣賞一下吧。

package mybinarytree;

public

class

createbianrytreebystring ;

int inorder = ;

node root=build.buildtreepreorderinorder(preorder,0,preorder.length-1,inorder,0,preorder.length-1);

build.preorder(root);

system.out.println();

build.inorder(root);

} public node buildtreepreorderinorder(int preorder,int begin1,int end1,int inorder,int begin2,int end2)

int rootdata=preorder[begin1];

node head=new node(rootdata);

int divider=findindexinarray(inorder,rootdata,begin2,end2);

int offset=divider-begin2-1;

node left=buildtreepreorderinorder(preorder,begin1+1,begin1+1+offset,inorder,begin2,begin2+offset);

node right=buildtreepreorderinorder(preorder,begin1+offset+2,end1,inorder,divider+1,end2);

head.left=left;

head.right=right;

return head;

} public

intfindindexinarray(int a,int x,int begin,int end)

return -1;

} public

void

preorder(node n)

} public

void

inorder(node n)

} class node

public node getleft()

public node getright()

public

intgetval()

} }

測試結果:

7,10,4,3,1,2,8,11,//前序序列

4,10,3,1,7,11,8,2,//中序序列

已知先序中序序列求後序序列

way 1.由先序和中序遍歷序列確定一棵二叉樹,再後序遍歷得到後序序列。如何確定呢?1.根據先序遍歷的第乙個結點確定根節點 2.根據根節點在中序遍歷序列的位置分割出左右兩個子串行,即根節點的左右子樹 3.對左右子樹按此方法遞迴進行分解。定義二叉樹的資料結構 typedef struct treeno...

已知後序中序序列求先序序列

方法呢,與前一篇一樣,建樹或者不建樹皆可,這裡不做過多說明,直接show code。way 1.typedef struct treenode bintree struct treenode bintree buildtree char post,char in,int n way 2.const ...

由中序序列和後序序列得到先序序列

寫的有點繁瑣,這次來個簡潔點的。思路都是一樣的 給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 le 8 8 22行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。11行,表示一棵二叉樹的先序。輸入 1複製 badc bdca輸出 1複製 abcd直...