《演算法筆記》9 2 二叉樹的遍歷

2021-10-05 12:22:02 字數 4385 閱讀 1101

一.先序遍歷

根結點——> 左子樹——> 右子樹

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...