設二叉樹中的結點均為乙個字元。假設擴充套件二叉樹的前序遍歷序列由鍵盤輸入,root為指向根結點的指標,二叉鍊錶的建立過程是:
1、按擴充套件前序遍歷序列輸入結點的值
2、如果輸入結點值為「#」,則建立一棵空的子樹
3、否則,根結點申請空間,將輸入值寫入資料域中,
4、以相同方法的建立根結點的左子樹
5、以相同的方法建立根結點的右子樹
遞迴方法
template
<
class
t>
bitree ::
bitree()
template
<
class
t>
binode
* bitree ::
creat()
return root
}
template
<
class
t>
void bitree::inorder (binode
*root)
}
非遞迴中序遍歷二叉樹
思想:遇到乙個結點,就把它推入棧中,並去遍歷它的左子樹
遍歷完左子樹後,從棧頂托出這個結點並訪問之,然後按照它的右鏈結指示的位址再去遍歷該結點的右子樹。
while
(!astack.
empty()
||root)if(
!astack.
empty()
)}}
template
<
class
t>
void bitree::
postorder
(binode
*root)
}
都是沿著左分支訪問,直到左分支為空時,再依次對棧中節點的右分支進行處理。(遵循從左至右的遍歷原則,體現深度優先搜尋的思想)
1、前序遍歷:每個節點只進棧一次,在進棧前訪問節點
2、中序遍歷:每個節點進棧一次,在出棧時訪問節點
3、後序遍歷:每個節點進棧兩次,在第二次出棧時訪問節點
需要用棧實現
根據後續遍歷的要求及棧操作的特點(filo),依次將:
根結點、根結點的右兒子、根節點的左兒子
入棧(不訪問)
當結點出棧時再進行訪問
當棧頂出現葉子結點時,直接進行出棧操作
當剛出棧元素和棧頂元素之間關係是「兒子-雙親」關係
定義乙個pre指標(初值為null),用它記錄剛剛訪問的結點,cur指標變數,指向棧頂(pre和cur是後續遍歷中相鄰的兩個節點)
先將根結點(指標)入棧
在棧不空的情況下
取棧頂(沒有出棧),記為cur
或者出棧:
如果cur->lchildnull &&cur->rchildnull
coutlchildpre ||cur->rchildpre
coutrchild ) push(cur->rchild);
if(!cur->lchild ) push(cur->lchild)
層序遍歷
1.佇列q初始化;
2. 如果二叉樹非空,將根指標入隊;
3. 迴圈直到佇列q為空
3.1 q=佇列q的隊頭元素出隊;
3.2 訪問結點q的資料域;
3.3 若結點q存在左孩子,則將左孩子指標入隊;
3.4 若結點q存在右孩子,則將右孩子指標入隊;
#include
using
namespace std;
template
<
class
t>
void bitree
::levelorder
(binarytreenode
* root)
//end while
}
template
<
class
t>
void bitree
::release
(binode
* root)
}template
<
class
t>
bitree::~
bitree
(void
)
資料結構筆記 樹 二叉樹 滿二叉樹
二叉樹滿二叉樹 樹是n n 0 個結點的有限集。結點為零的樹為空樹。任意一棵非空樹中 1.有且有乙個特定的稱為根的結點 2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每乙個集合又是一棵樹,並稱為根的子樹。1.結點擁有的子樹數稱為結點的度 2.度為0的結點稱為葉結點或分支結點,除根...
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...
C 資料結構 二叉樹操作
基本知識點不講了,直接說遍歷問題 前序遍歷 根節點 左子樹 右子樹 中序遍歷 左子樹 根節點 右子樹 後序遍歷 左子樹 右子樹 根節點 具體看 未完待續,困,明天繼續 binarytreetest.cpp 定義控制台應用程式的入口點。include stdafx.h include include ...