由前序和中序建立二叉樹的演算法

2021-07-12 07:24:39 字數 1586 閱讀 9650

網上根據前序和中序建立二叉樹的**是這樣的:

void create_tree(tree *t,int pre_s,int pre_e,int in_s,int in_e)
if(root_index!=in_s)//存在左子樹
else (*t)->lchild=null;
if(root_index!=in_e)//存在右子樹
else (*t)->rchild=null;
}

假設有乙個例子:

前序:dbacegf

中序:abcdefg

讓我們建立二叉樹???

用這個演算法來解就是先根據前序字串的第乙個字元找到根節點--d,然後在中序中查詢根節點d的位置,d的左邊為左子樹(注意如果d在中序的位置和in_s也就是中序的第乙個元素相同那麼d就沒有左子樹,沒有為null),d的右邊為右子樹(注意和前面一樣)。然後就採用遞迴就可以了。

其實上面**比較難理解的也就是那兩條遞迴式子。

首先:存在左子樹時,它的遞迴是這樣子的:

create_tree(&(*t)->lchild,pre_s+1,(root_index-in_s)+pre,in_s,root_index-1);
前序:dbacegf
中序:abc

defg

首先前序的第乙個元素d已經被我們訪問了(根節點d的左子樹有:abc),所以排除了,那麼現在前序第乙個元素的下標就是pre_s+1,也就是元素b的位置;

前序的最後乙個元素下標:

(root_index-in_s)+pre 它是怎麼來的呢?

首先用root_index-in_s從中序得到根節點d的左子樹個數(3個abc),然後在加上前序的第乙個元素的下標不就得到前序的最後乙個元素的下標了嗎!

中序的第乙個元素下標沒變;

中序的最後乙個元素變成了元素c,下標就等於元素d的下標-1也就是root_index-1

遞迴時的前序:bac
遞迴時的中序:abc

存在右子樹時也是差不多的原理就不說了。

如果你仔細觀察上面的**就可以發現其實前序的最後乙個元素下標,即pre_e,在整個演算法中是沒有用到的,我們將它去掉後依然可以建立二叉樹。

由前序和中序建立二叉樹

c語言版本 1.找出根節點 先序的第乙個節點是根節點 2.分出左右子樹 再根據中序分出左右子樹 在中序中找出與根節點相同的節點,該位置兩邊分別是左右子樹 3.遞迴 4.返回根節點版本1 低效,不借助其他工具類 definition for a binary tree node.public clas...

由前序 中序,輸出二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。treenode build vectorpre,vectorin 思路 遞迴邊界 當前序為空時,返回空,當前序只有乙個元素時,顯然...

二叉樹 由前序遍歷和中序遍歷重建二叉樹

由前序遍歷和中序遍歷重建二叉樹 前序序列 1 2 3 4 5 6 中序序列 3 2 4 1 6 5 思路 前序遍歷第乙個是根節點。中序遍歷根節點左側為左子樹,根右側為右子樹。那麼先構造根節點,根節點左側都為左子樹,根右側都為右子樹。然後對左右子樹遞迴式的構造即可。封裝 binarytreenode ...