用二叉鍊錶來儲存二叉樹
typedef
struct bitnode //二叉樹
bitnode,
*bitree;
輸入乙個陣列,以層次遍歷的順序進行建樹,規定陣列元素都大於0。當陣列元素為-1時,表示該結點為空。
舉個例子,比如陣列大小為 12,陣列元素為
356
8-12
78134
-165
則建立的二叉樹為
建立二叉樹的**:
queue q;
//輔助佇列
void
createbitree()
//建立二叉樹
int counts =1;
for(
int i =
1; i <= n; i++
)else
//空結點標記
}while
(!q.
empty()
)//清除佇列中的空結點
}
訪問結點
void
visit
(bitree t)
層次遍歷
void
levelorder
(bitree t)
q.push
(t);
//根結點入隊
while
(!q.
empty()
)}
先序遍歷,也叫前序遍歷
void
preorder
(bitree t)
}
中序遍歷
void
inorder
(bitree t)
}
後序遍歷
void
postorder
(bitree t)
}
中序遍歷
沿著根的左孩子,依次入棧,直到左孩子為空
棧頂元素出棧並訪問,若其右孩子為空,繼續執行 2
若其右孩子不空,將右子樹轉向執行 1
void
inorder2
(bitree t)
else
//出棧,轉向出棧結點的右子樹
}}
先序遍歷和中序遍歷很相似,區別在於掃瞄結點時先訪問結點,再將其入棧
void
preorder2
(bitree t)
else
}}
後序遍歷
初始時依次掃瞄根結點的所有左側結點並將它們全部依次進棧
讀棧頂元素,若其右孩子不為空且未被訪問過,將右子樹轉向 1
否則,棧頂元素出棧並訪問
注意:在第二步中,需要分清返回時是從左子樹返回的還是右子樹返回的,設定乙個輔助指標 r,指向最近訪問過的結點。
每次出棧訪問完乙個結點就相當於遍歷完以該結點為根的子樹,需要將 p 置空。
void
postorder2
(bitree t)
else
else
//否則,彈出棧頂元素並訪問}}
}
#include
#include
#include
#include
using namespace std;
typedef
struct bitnode //二叉樹
bitnode,
*bitree;
queue q;
//輔助佇列
void
createbitree()
;//層次序列建立二叉樹
void
visit
(bitree r)
;//訪問結點
void
levelorder
(bitree r)
;//層次遍歷
/* 遞迴的先序、中序、後序遍歷 */
void
preorder
(bitree r)
;void
inorder
(bitree r)
;void
postorder
(bitree r)
;/* 非遞迴的先序、中序、後序遍歷 */
void
preorder2
(bitree r)
;void
inorder2
(bitree r)
;void
postorder2
(bitree r)
;int
main()
void
createbitree()
//建立二叉樹
for(
int i =
1; i <= n; i++
)else
//空結點標記
}while
(!q.
empty()
)//清除佇列中的空結點
}void
visit
(bitree t)
void
levelorder
(bitree t)
q.push
(t);
//根結點入隊
while
(!q.
empty()
)}void
preorder
(bitree t)
}void
inorder
(bitree t)
}void
postorder
(bitree t)
}void
preorder2
(bitree t)
else}}
void
inorder2
(bitree t)
else
//出棧,轉向出棧結點的右子樹}}
void
postorder2
(bitree t)
else
else
//否則,彈出棧頂元素並訪問}}
}
程式執行結果如下:
二叉樹的遍歷總結
2 中序遍歷 3 後序遍歷 4 層次遍歷 給定乙個二叉樹,返回它的前序 遍歷。示例 輸入 1,null,2,3 輸出 1,2,3 definition for a binary tree node.public class treenode class solution private void h...
二叉樹的遍歷總結
遍歷方式 根結點 左孩子 右孩子 definition for a binary tree node.struct treenode class solution 遍歷方式 處理過程 definition for a binary tree node.struct treenode class so...
二叉樹遍歷 推導總結
第一次總結,個人淺見,望大牛們輕削,怕疼,呵呵 1.已知前序遍歷和中序遍歷序列,可以唯一確定一棵二叉樹。2.已知後序遍歷和中序遍歷序列,可以唯一確定一棵二叉樹。3.已知後續遍歷和前序遍歷序列,不能唯一確定一棵二叉樹。綜上 要想唯一確定乙個二叉樹,必須要有中序遍歷序列。遍歷規則 1 先序或者前序遍歷規...