一.先序遍歷
根結點——> 左子樹——> 右子樹
void
preorder
(node* root)
性質:序列的第乙個一定是根結點;
二.中序遍歷
左子樹——> 根結點——> 右子樹
void
inorder
(node* root)
性質:只要知道根結點,就可以區分左子樹和右子樹;
三.後序遍歷
左子樹——> 右子樹——> 根結點
void
postorder
(node* root)
性質:序列的最後乙個是根結點
四.層序遍歷
1.實現**:
void
layerorder
(node* root)
}
2.記錄層號:
void
layerorder
(node* root)
if(now-
>rchild !=
null)}
}
3.用先序遍歷和中序遍歷重建二叉樹:
struct node
;node*
create
(int prel,
int prer,
int inl,
int inr)
int numleft = k - inl;
root-
>lchild =
create
(prel +
1, prel + numleft, inl, k -1)
; root-
>rchild =
create
(prel + numleft +
1, prer, k +
1, inr)
;return root;
}
4.用層序遍歷和中序遍歷重建二叉樹:
struct node
;node*
create
(int layerl,
int layerr,
int inl,
int inr)
int numleft = k - inl;
root-
>lchild =
create
(layerl *
2, layerr, inl, k -1)
; root-
>rchild =
create
(layerl *2+
1, layerr, k +
1, inr)
;return root;
}
五.二叉樹的靜態實現
不使用指標的實現方式
//定義:
struct node node[maxn]
;//maxn 為結點上限個數
//新結點生成:
int index =0;
intnewnode
(int v)
//查詢、修改:
void
search
(int root,
int x,
int newdata)
//插入:
void
insert
(int
&root,
int x)
if(x應該插在左子樹)
insert
(node[root]
.lchild, x)
;else
insert
(node[root]
.rchild, x);}
//建立:
intcreate
(int data,
int n)
六.題目:
1.pat a1020
注意:1).輸出格式:printf("%d", temp->data); num++; if(num < n) printf(" ");
**:
#include
#include
using
namespace std;
const
int maxn =40;
int post[maxn]
, in[maxn]
;int num =0;
int n;
struct node
;node*
create
(int postl,
int postr,
int inl,
int inr)
int numleft = k - inl;
root-
>lchild =
create
(postl, postl + numleft -
1, inl, k -1)
; root-
>rchild =
create
(postl + numleft, postr -
1, k +
1, inr)
;return root;
}void
print
(node* root)
}int
main()
2.pat a1086
思路:1).如何輸入:先輸入%s,判定是 push/pop:if(strcmp(str, "push") == 0)
,再輸入數字或者不輸入數字,再進行之後的操作;
2).模擬棧,用 stack;
**:
#include
#include
#include
using
namespace std;
const
int maxn =40;
int n, num =0;
int pre[maxn]
, in[maxn]
;struct node
;node*
create
(int prel,
int prer,
int inl,
int inr)
int numleft = k - inl;
root-
>lchild =
create
(prel +
1, prel + numleft, inl, k -1)
; root-
>rchild =
create
(prel + numleft +
1, prer, k +
1, inr)
;return root;
}void
print
(node* root)
intmain()
else
} node* root =
create(0
, n -1,
0, n -1)
;print
(root)
;return0;
}
3.pat a1102
思路:如何輸入:scanf("%*c%c %c", &x1, &x2);
%*c 表示接收乙個換行符;
**:
#include
#include
using
namespace std;
const
int maxn =20;
int n;
int num1 =
0, num2 =0;
struct node node[maxn]
;void
layerprint
(int root)
}void
inprint
(int root)
intmain()
if(x2 ==
'-') node[i]
.lchild =-1
;else
}int i;
for(i =
0; i < n; i++
)int root_i = i;
layerprint
(root_i)
;inprint
(root_i)
;return0;
}
二叉樹遍歷演算法
二叉樹是一種非線性的資料結構,在對它進行操作時,總是需要逐一對每個資料元素實施操作,這樣就存在乙個操作順序問題,由此提出了二叉樹的遍歷操作。所謂遍歷二叉樹就是按某種順序訪問二叉樹中的每個結點一次且僅一次的過程。這裡的訪問可以是輸出 比較 更新 檢視元素內容等等各種操作。在這裡寫了個二叉樹遍歷演算法 ...
二叉樹的遍歷演算法
遞迴演算法 void pre root 先序遍歷非遞迴演算法 void pre2 root if s.isempty 中序遍歷非遞迴 void pre2 root if s.isempty 中序遍歷的程式設計題 後序遍歷非遞迴 借助兩個棧來實現 void post if root null retu...
二叉樹的遍歷演算法
二叉樹的遍歷 二叉鍊錶typedef struct btnode btnode,bintree 三叉鍊錶typedef struct btnode btnode,bintree 二叉鍊錶和三叉鍊錶都是用來描繪二叉樹的!一 層序遍歷void levelorder bintree bt define m...