對於二叉樹,我們一般的遍歷方式有先序遍歷(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...