樹與二叉樹

2021-08-18 02:36:41 字數 1648 閱讀 7134

一棵樹是一些節點的集合。這個集合可以是空集;若不是,則一棵樹由稱為根(root)的節點r和若干非空的子樹組成。每乙個子樹的根叫做根r的兒子,根r稱為這些子樹的根的父親。

從定義中發現:一棵樹是n個節點和n-1條邊的集合。

沒有兒子的節點稱為樹葉

具有相同父親的節點稱為兄弟

從節點n1到節點nk的路徑定義為節點n1,n2...nk的乙個序列。

這個路徑的長稱為該路徑上邊的條數,即為k。

從每個節點都有一條到自己長度為0的路徑

樹中,從根到每個節點都恰好存在一條路徑

對任意節點ni,其深度為根到ni的唯一路徑的長。

為ni到一片葉子最長路徑的長。

如果存在從n1到n2的一條路徑,那麼n1是n2的一位祖先,而若n1!=n2,那麼n1是n2的乙個真祖先

之所以不使每個節點包括它全部的子節點是因為每個節點的兒子數可能變化很大而事先並不知道,這回產生大量的空間浪費。

二叉樹是一種每個節點都不能由多於兩個的兒子的樹。

因為兒子的個數已經被確定,所以可以用列出所有子節點的方式實現二叉樹

typedef struct treenode *ptrtonode;

typedef struct ptrtonode tree;

struct treenode

;

表示式樹是一種二叉樹:他的樹葉是運算元,其他節點為操作符。

因為如果不考慮一目減運算子的話,所有操作符都是二元的,所以乙個表示式可以寫成一顆表示式樹。

而如果要把一棵表示式樹展開成表示式,一般有以下幾種策略:

一、通過遞迴產生乙個帶括號的左表示式,然後列印在根處的運算子,最後遞迴地列印乙個帶括號的右表示式,從而得到乙個中綴表示式。這種方式(左,節點,右)稱為中序遍歷。

這種方式的輸出為:(a+(b*c))+((d*e+f)*g)

二、遞迴列印出左子樹,右子樹,然後是節點的運算子,這種方式稱為後序遍歷。

它的輸出為字尾表示式:abc*+de*f+g*+

三、先列印出運算子,再遞迴地列印左右子樹,稱為先序遍歷。

它的輸出為字首表示式: ++a*bc*+*defg

#構造一棵表示式樹

以後綴表示式為例:

整體思路是,如果讀入為運算元,則新建一棵樹,壓入棧中,如果是運算子,則彈出前兩棵樹,與運算子組成一棵新樹,壓入棧中。

實現略。

二叉樹 滿二叉樹與完全二叉樹

二叉樹 binary tree 是n n 0 個元素的有限集合,該集合為空或者為由乙個稱為 根 的元素及兩個不相交的 被分別稱為左子樹和右子樹的二叉樹組成 二叉樹的基本特點 每個結點最多有兩棵子樹 左子樹和右子樹是有順序的,且不可顛倒 圖一1 結點 二叉樹中的每乙個元素都稱為結點。通常二叉樹的許多名...

樹與二叉樹

樹是一類重要的非線性資料結構,是以分支關係定義的層次結構 定義 樹 tree 是n n 0 個結點的有限集t,其中 n 0時為空樹 n 0時,有且僅有乙個特定的結點,稱為樹的根 root 當n 1時,其餘結點可分為m m 0 個互不相交的有限集t1,t2,tm,其中每乙個集合本身又是一棵樹,稱為根的...

樹與二叉樹

建立 先序二叉樹,中序二叉樹,後序二叉樹。給定兩種遍歷序列 前序中序或後序中序 重塑二叉樹 遍歷 判斷乙個節點是否存在於二叉樹中 二叉樹的遍歷 先序,中序,後序 遞迴 非遞迴 層次遍歷 從上到下或從下到上列印 zigzag遍歷方式層次遍歷 二叉樹性質 二叉樹中葉子節點的個數 二叉樹第k層節點數目 二...