從二叉樹的先序和中序構建二叉樹

2021-09-26 20:14:30 字數 1161 閱讀 2767

對於二叉樹,我們一般的遍歷方式有先序遍歷(preorder),中序遍歷(inorder),後序遍歷(afterorder),層序遍歷(levelorder),每個遍歷方式都有自己的特點(這個大家可以自行了解,很簡單),下面我們就來看一下利用樹的先序(後序)和中序遍歷來構建二叉樹

先序遍歷的特點:陣列的頭一定是根節點,然後再從根結點向左向右遍歷

中序遍歷的特點:陣列的頭結點將陣列分成兩部分,左邊為左子樹,右邊為右子樹。

首先我們來看結點的定義:

class treenode

}

然後開始我們的操作:

//建立solution類

class solution

//由於先序遍歷的pstart結點是根節點,所以找出根節點並封裝成treenode

int root_val=preorder[pstart];

treenode node=new treenode(root_val);

//利用map.get()方法得到根節點在中序遍歷陣列中的下標,其可以將中序數組分為左子樹和右子樹兩部分

int root_index=map.get(root_val);

//只需要記錄左子樹的長度

int left=root_index-istart;

/*根結點建立左子樹:根節點剛好在pstart處,所以在先序陣列中pstart+1就是左子樹的根,

pstart+left+1為右子樹,對應在中序陣列中從istart到root_index為左子樹,root_index+1到

iend為右子樹

*/node.left=buildtree(preorder,pstart+1,pstart+left+1,inorder,istart,root_index,map);

//根節點建立右子樹

node.right=buildtree(preorder,pstart+left+1,pend,inorder,root_index+1,iend,map);

//最終返回node為二叉樹的根節點

return node;

}}

上述為先序+中序構造的二叉樹,而後序+中序則剛好與之相反,但是思想是一致的。只需要調換位置即可。

先序構建二叉樹及先序遍歷二叉樹

先序為dlr d 根節點,l 左子樹,r 右子樹 a b c d e 先序序列為abdce,輸入為abd c e 表示空格,代表空樹 輸入按滿二叉樹輸入 每乙個節點都是乙個子樹的根節點 void pre create tree treenode t else else void pre visit ...

先序構建二叉樹及先序遍歷二叉樹

先序為dlr d 根節點,l 左子樹,r 右子樹 a b c d e 先序序列為abdce,輸入為abd c e 表示空格,代表空樹 輸入按滿二叉樹輸入 每乙個節點都是乙個子樹的根節點 void pre create tree treenode t else else void pre visit ...

先中序構建二叉樹

資料結構學到二叉樹了。覺得有點難了。大家都知道,先序 中序或者中序 後序才能確定一棵二叉樹。這次用的是先序和中序構建二叉樹,再用層序遍歷輸出。先序 7 10 4 3 1 2 8 11 中序 4 10 3 1 7 11 8 2 那麼層序就是 7 10 2 4 3 8 1 11 struct binar...