二叉樹整理(五)

2021-07-25 04:34:44 字數 1492 閱讀 1861

二叉樹前序遍歷序列中,第乙個元素總是樹的根節點的值。中序遍歷序列中,左子樹的節點的值位於根節點的值的左邊,右子樹的節點的值位 

於根節點的值的右邊。 

遞迴解法: 

(1)如果前序遍歷為空或中序遍歷為空或節點個數小於等於0,返回null。 

(2)建立根節點。前序遍歷的第乙個資料就是根節點的資料,在中序遍歷中找到根節點的位置,可分別得知左子樹和右子樹的前序和中序遍 

歷序列,重建左右子樹。

binarytreenode * rebuildbinarytree(int* ppreorder, int* pinorder, int nodenum)

if(rootpositioninorder == -1)

// 重建左子樹

int nodenumleft = rootpositioninorder;

int * ppreorderleft = ppreorder + 1;

int * pinorderleft = pinorder;

proot->m_pleft = rebuildbinarytree(ppreorderleft, pinorderleft, nodenumleft);

// 重建右子樹

int nodenumright = nodenum - nodenumleft - 1;

int * ppreorderright = ppreorder + 1 + nodenumleft;

int * pinorderright = pinorder + nodenumleft + 1;

proot->m_pright = rebuildbinarytree(ppreorderright, pinorderright, nodenumright);

return proot;

}

同樣,有中序遍歷序列和後序遍歷序列,類似的方法可重建二叉樹,但前序遍歷序列和後序遍歷序列不同恢復一棵二叉樹,證明略。

若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全 

二叉樹。 

有如下演算法,按層次(從上到下,從左到右)遍歷二叉樹,當遇到乙個節點的左子樹為空時,則該節點右子樹必須為空,且後面遍歷的節點左 

右子樹都必須為空,否則不是完全二叉樹。

bool iscompletebinarytree(binarytreenode * proot)

}else

else

if(pnode->m_pleft !=

null

&& pnode->m_pright ==

null)

else

if(pnode->m_pleft ==

null

&& pnode->m_pright !=

null)

else}}

return result;

}

二叉樹習題整理(二)

編寫遞迴演算法,求二叉樹中以元素值為x的結點為根的子樹的深度 先遞迴找出x的位置,用p指向,然後找到子樹的深度 求樹的深度的思路 1 如果樹為空,則深度為0 2 如果樹不是空,那麼深度是左子樹的深度 1或右子樹的深度 1 int t644 bitree t,telemtype x bitree lo...

二叉樹(五) B 樹

b 樹是基於b 樹的一種變體,有著比b 樹更高的查詢效能。除了具備b 樹的特性外,b 樹也具備一些新的特性 乙個m階的b 樹具有如下幾個特徵 1.有k個子樹的中間節點包含有k個元素 b樹中是k 1個元素 每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。2.所有的葉子結點中包含了全部元素的資...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...