2.二叉樹的儲存結構
二叉樹的遍歷
1. 二叉樹的性質
1.1滿二叉樹
定義:在二叉樹中, 每一層的結點數都是滿的 (見二叉樹的性質2),乙個n層的滿二叉樹,結點數量一共有2n-1個。
1.2完全二叉樹
定義:滿二叉樹中 只有最後一層有缺失的結點,並且 缺失的編號都在最後。
性質:以一顆結點數量為k的完全二叉樹,設0號點為根節點。
2.二叉樹的儲存結構
二叉樹一般用指標來實現,並指向左、右子結點。
struct treenode
;
完全二叉樹可以用陣列實現,會更加方便。
1.深度優先遍歷
blog.csdnimg.cn/20200507194553816.png)
按根節點訪問順序分類:
tip:根結點已粗體
在進行具體遍歷的情況下,應在最後一層結點後面加上空的左右結點null,null是一條路走完的標誌,遞迴終止的條件。
1.1先序遍歷
1.1.1遞迴寫法:
在使用遞迴方法時,
void
preorder
(const treenode *root)
printf
("%c "
, root-
>value)
;//輸出根節點的值
preorder
(root-
>l)
;//前序訪問左子樹
preorder
(root-
>r)
;//前序訪問右子樹
}
1.1.2非遞迴寫法
前序遍歷中,棧中元素是自己和自己的左孩子都訪問過了,而右孩子還沒有訪問到的節點。
往左邊走,一邊輸出一邊壓棧,直到遇null,開始彈出棧頂。
void
preorder_
(treenode *root)
//直至左孩子為空,從棧中拿出棧頂結點top。
top = s.
top();
s.pop();
//上面已經確定了根節點,便可直接訪問到右孩子。
cur = top-
>r;
}}
1.2中序遍歷
1.2.1遞迴寫法:
void
inorder
(const treenode *root)
inorder
(root-
>l)
;//中序遍歷左子樹
printf
("%c "
, root-
>value)
;//訪問節點值
inorder
(root-
>r)
;//中序遍歷右子樹
}
1.2.2非遞迴寫法:
而中序訪問時棧中儲存的元素是節點自身和它的右子樹都沒有被訪問到的節點位址。
沿著最左邊往下訪問,路過的節點全部壓棧,直到遇到空節點。
1.3後序遍歷
1.3.1遞迴寫法:
void
postorder
(treenode *root)
postorder
(root-
>l)
;//後序遍歷左子樹
postorder
(root-
>r)
;//後序遍歷右子樹
printf
("%c "
, root-
>value)
;//訪問節點值
}
1.3.2非遞迴寫法:
棧中儲存的元素是它的右子樹和自身都沒有被遍歷到的節點。
與中序遍歷不同的是先訪問右子樹,回來的時候再輸出根節點的值。
多乙個last指標指向上一次訪問到的節點,用來確認是從根節點的左子樹返回的還是從右子樹返回的。
void
postorder_
(treenode *root)
top = s.
top();
if(top-
>r ==
null
|| top-
>r == last)
else
}}
資料結構(一) 二叉樹
二叉樹是由n n 0 個結點組成的有序集合,集合或者為空,或者是由乙個根節點加上兩棵分別稱為左子樹和右子樹的 互不相交的二叉樹組成。假設二叉樹節點總數為n,度數為1的節點個數為n1,則n n0 n1 n2成立,除根節點外,其它節點通過一條樹枝且僅通過一條樹枝與其父節點相連,而二叉樹中樹枝總數為n1 ...
資料結構二叉樹性質
性質是從概念觀察 思考得來,我們此處總結歸納一些有用的性質 性質1 二叉樹的第n層,最多有2 n 1 個節點 n 1,第一層,最多1個節點,2 1 1 1 n 2,第二層,最多2個節點,2 2 1 2 n 3,第三次,最多4個節點,2 3 1 4 性質2 深度為n的二叉樹,最多有2 n 1個節點 第...
資料結構 二叉樹 二 二叉樹的性質
滿二叉樹是每層的節點個數都達到了最多的二叉樹,如下圖所示 完全二叉樹是節點的編號順序與滿二叉樹一致,但最後一層的節點可能會在末尾連續得少一些,如下圖所示 從上往下數,第i層上最多有2 i 1 個節點。深度為k得二叉樹至多有2 k 1個節點 對任意一顆二叉樹,其終端節點 葉子節點 數為n0,度為2的節...