樹(3)二叉樹的遍歷及應用

2021-10-05 15:14:59 字數 2597 閱讀 4715

1.二叉樹的遍歷

概念遍歷:按一定次序訪問樹中所有節點,並且每個節點僅被訪問一次的過程。

先序遍歷:訪問根節點;先序遍歷左子樹;先序遍歷右子樹。

中序遍歷:中序遍歷左子樹;訪問根節點;中序遍歷右子樹。

後序遍歷:後序遍歷左子樹;後序遍歷右子樹;訪問根節點。

例如:括號表示法為a(b(d(,g),c(e,f))的二叉樹,先序遍歷為abdgcef,中序遍歷為dgbaecf,後序遍歷為gdbefca。

void

preorder

(btnode* root)

}void

postorder

(btnode* root)

}void

inorder

(btnode* root)

}

先序、中序、後序遍歷的非遞迴實現

中序遍歷的過程:

(1)沿著根的左孩子,依次入棧,直到左孩子為空;

(2)訪問棧頂元素並出棧;

(3)若棧頂元素的右孩子不空,則對右孩子執行(1)。

先序與中序的區別在於:左孩子入棧時,先序在入棧之前就要進行訪問。

void

inorder

(treenode* root)

//訪問棧頂元素並出棧,若棧頂元素右孩子非空,轉向右孩子

else}}

void

preorder

(treenode* root)

else

}}

後序遍歷的過程:

(1)沿根的左孩子,依次入棧,直到左孩子為空;

(2)讀取棧頂元素,若其右孩子不空且未被訪問過,對右子樹執行步驟(1);否則,棧頂元素出棧並訪問。

void

postorder

(treenode* root)

else

//棧頂元素出棧並訪問

else}}

}

層次遍歷:從根節點開始,從上到下,從左到右的順序訪問每乙個節點。

用乙個佇列儲存待訪問結點,容易實現對二叉樹的層序遍歷。演算法設計思路:

(1)將根節點進隊;

(2)隊不為空時迴圈:從佇列**列乙個節點*p,訪問它:

\quad \quad

若它有左孩子節點,將左孩子節點進隊;若它有右孩子節點,將右孩子節點進隊。

void

levelorder

(btnode* root)

if(p-

>rnode !=

nullptr)}

}

2. 二叉樹遍歷的應用

例1:二叉樹採用二叉鏈儲存,設計演算法計算節點個數。

遞迴模型:當root為空指標時,f(root)=0;否則,f(root)=f(root->lchild)+f(root->rchild)+1.

int

nodes

(btnode* root)

例2:二叉樹採用二叉鏈儲存,設計演算法計算所有葉子節點數。

遞迴模型:若root=null,f(root)=0;若root為葉子節點,f(root)=1;否則,f(root)=f(root->lchild)+f(root->rchild).

int

leafnodes

(btnode* root)

例3:二叉樹採用二叉鏈儲存結構,設計演算法把二叉樹b複製到t中。

遞迴模型:若b=null,f(b,t)=t=null;否則,複製根節點b產生t節點,然後將b的左右子樹複製為t的左右子樹:f(b->lchild,t->lchild),f(b->rchild,t->rchild)。

void

copy

(btnode* b, btnode*

&t)}

例4:設計演算法把二叉樹的左右子樹進行交換。(通過建立乙個新的二叉樹t實現交換)

遞迴模型:若b=null,則t=null;其他情況時,複製根節點b產生t節點,將b的左子樹複製為t的右子樹,b的右子樹複製為t的左子樹,即f(b->lchild,t->rchild),f(b->rchild,t->lchild).

void

swap

(btnode* b, btnode*

&t)}

例5:設計level(b,x,h)返回b中值為x的節點的層次h。

假設「h表示b所指節點的層次」,遞迴模型為:

若b=null,level(b,x,h)=0;若b指向的節點值為x,則level(b,x,h)=h;其他,首先在左子樹中找,若找到了直接返回,否則返回在右子樹中的查詢結果.(先序遍歷的思想)

int

level

(btnode* b,

char x,

int h)

}

二叉樹及二叉樹的遍歷

二叉樹的定義 樹的度為2的樹。二叉樹的遞迴定義 二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。1.第i層上至多有2的i 1次方個結點。2.深度為h的二叉樹至多有2的h次方減1個結點。3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一...

二叉樹的應用 二叉樹遍歷的應用

在以上討論的遍歷演算法中,訪問結點的資料域資訊,即操作visite bt data 具有更一般的意義,需根據具體問題,對bt 資料進行不同的操作。下面介紹幾個遍歷操作的典型應用。search bt,x 在bt 為二叉樹的根結點指標的二叉樹中查詢資料元素x。查詢成功時返回該結點的指標 查詢失敗時返回空...

二叉樹及其應用 二叉樹遍歷

給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...