還原本來的二叉樹並不是乙個非常簡單的事,雖然思想比較簡單,但過程卻是比較繁瑣。下面我拿先序序列和中序序列來講一下原理吧。
從先序序列中我們一下子就可以得到二叉樹的根節點是第乙個元素,然後再中序序列中我們也可以找到這個元素(假設二叉樹中所有的元素的值不相同)這樣我們就可以把中序序列分成兩部分,前部分和先序序列可求得左子樹,後部分與先序序列可求得右子樹。下面以左部分為例,在除去根節點的前序序列中的第二個元素,就是我們左子樹的的第乙個節點,然後繼續在中序序列的前部分中找到相同的元素,再次對中序序列進行分割。····最後我們就可以得到恢復的二叉樹了。
純文字的講述不太容易理解,下面我拿個具體的例子來分析吧。
比如
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直...