二叉樹及二叉樹的遍歷

2022-08-01 01:36:11 字數 1566 閱讀 3691

**:

二叉樹的定義:樹的度為2的樹。

二叉樹的遞迴定義:二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。

1.第i層上至多有2的i-1次方個結點。

2.深度為h的二叉樹至多有2的h次方減1個結點。

3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一層右邊缺若干個結點的樹稱為完全二叉樹

(對結點的編號通常都是從滿二叉樹的樹根開始,從上到下從左到右編號)。

完全二叉樹的重要性質:

根結點序號為i=1的情況下:

1.編號為i的結點,左孩子編號為2i,右孩子編號為2i+1.

2.除根結點外,編號為i的結點,其父結點的標號為i/2向下取整。

同線性表一樣,二叉樹有順序和鏈結兩種儲存結構。

順序儲存一棵二叉樹,首先對該樹中每個結點進行編號,然後以各個結點的編號為下標,把各結點的值對應儲存到乙個一維陣列中。

每個結點的編號與等深度的滿二叉樹中對應的結點編號相同,即樹根編號為1,然後從上到下從左到右編號,i結點的左右孩子為2i和2i+1.

缺點:對於單支結點較多的二叉樹來說很多儲存位置空閒。

另一種方法是,在如上的結構中再增加乙個parent指標域(便於查詢父結點)。

不帶雙親指標的鏈結儲存結構稱作二叉鍊錶,既可以由獨立分配的結點鏈結而成,也可以由陣列中的元素結點鏈結而成。

獨立結點的型別可以這樣定義:

struct

btreenode;

陣列元素結點可以定義為

struct

abtreenode;

第二種形式中left和right域分別儲存左右孩子結點所在單元的下標,所以被定義為整型。

在陣列中建立二叉樹的好處是,建立好後可以把整個陣列寫入到檔案中儲存起來,需要時再從檔案中讀入到陣列中。

設二叉樹由btreenode型別的、通過動態分配產生的獨立結點鏈結而成,並設bt為指向根結點的指標。

void preorder(btreenode*bt)

}

void inorder(btreenode*bt)

}

void postorder(btreenode*bt)

}

可以按照二叉樹的層次結構進行遍歷,即按照從上到下從左到右的次序訪問各個結點。

按層遍歷演算法需要使用乙個佇列,開始時把整個樹的根結點入隊,然後每從佇列中刪除乙個結點並輸出該結點的值時,都把它的非空的左右孩子結點入隊,這樣當佇列空時演算法結束。

按層遍歷

//按層遍歷

void levelorder(btreenode*bt)

while(front!=rear) //

當佇列非空時執行迴圈

if(p->right !=null) //

若存在右孩子,則該結點指標進隊

}//while end

}

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

二叉樹 二叉樹

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

玩轉二叉樹(二叉樹的遍歷)

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 ...