樹 - 二叉樹的遍歷和初始化
阿新 • • 發佈:2018-11-16
二叉樹
4 / \ 1 7 / \ / \ 0 2 5 8 \ \ \ 3 6 9
二叉樹的前序、中序、後序遍歷
按訪問根結點的順序區分:
前序:NLR(根結點-左子樹-右子樹) 4 1 0 2 3 7 5 6 8 9
中序:LNR(左子樹-根結點-右子樹) 0 1 2 3 4 5 6 7 8 9
後續:LRN(左子樹-右子樹-根結點) 0 3 2 1 6 5 9 8 7 4
子樹也是按照同樣的遍歷順序,所以是一個遞迴過程
typedef struct Tree{ int val; Tree *left; Tree *right; //Tree(int v):val(v){} }*P_Tree; //二叉樹遍歷 -- 前序遍歷 int preVisitBiTree(P_Tree node){ if(NULL == node){ return -1; } cout << node->val << " "; preVisitBiTree(node->left); preVisitBiTree(node->right); return 0; } //二叉樹遍歷 -- 後序遍歷 int behindVisitBiTree(P_Tree node){ if(NULL == node){ return -1; } behindVisitBiTree(node->left); behindVisitBiTree(node->right); cout << node->val << " "; return 0; } //二叉樹遍歷 -- 中序遍歷 int midVisitBiTree(P_Tree node){ if(NULL == node){ return -1; } midVisitBiTree(node->left); cout << node->val << " "; midVisitBiTree(node->right); return 0; }
二叉樹的層序遍歷
從上到下,從左到右遍歷 4 1 7 0 2 5 8 3 6 9
利用佇列實現(Q)
佇列的實現參考:佇列 - 佇列的建立和基本操作
> 根結點從列隊尾push入列隊Q
while(Q不為空){
從列隊頭pop出一個結點t
訪問結點t
if(t的左子樹不為空){
t的左子樹從列隊尾push入列隊Q
}
if(t的右子樹不為空){
t的右子樹從列隊尾push入列隊Q
}
} //是一個迴圈過程
//二叉樹層序遍歷
void levelVisit(P_Tree tree){ if(!tree){ return; } Queue q; q=createQueue(); P_Tree t; t=tree; push(t,q); while(!isEmpty(q)){ t=pop(q); cout << t->val << " "; if(t->left){ push(t->left,q); } if(t->right){ push(t->right,q); } } }
===========================================================
二叉樹的初始化(構造、建立)
//以前序遍歷的方式構造一顆二叉樹 //遞迴構造
//空結點用標記字元(#)表示
// 4 1 0 # # 2 # 3 # # 7 5 # 6 # # 8 # 9 # #
int makeBiTree(int **nv,P_Tree *node){
if(**nv == '#') {
*node=NULL;
return -1;
}
*node=(P_Tree)malloc(sizeof(Tree));
(*node)->val=**nv;
(*nv)++;
makeBiTree(&(*nv),&(*node)->left);
(*nv)++;
makeBiTree(&(*nv),&(*node)->right);
return 0;
}
int main(){
int arr[21]={4, 1, 0, '#', '#', 2, '#', 3, '#', '#', 7, 5, '#', 6, '#', '#', 8, '#', 9, '#', '#'};
P_Tree rootNode = NULL;
int *p=arr; //arr與&arr的區別參考備註
makeBiTree(&p,&rootNode); //指標的指標
return 0;
}
備註:
int arr[2]={1,2}; // ? arr 與 &arr
//測試arr與&arr
#include <iostream>
int main(){
int arr[2]={1,2};
std::cout << arr << " : " << *(arr) << std::endl << " ";
std::cout << arr+1 << " : " << *(arr+1) << std::endl;
std::cout << &arr << " : " << *(&arr) << std::endl << " ";
std::cout << &arr+1 << " : " << *(&arr+1) << std::endl;
return 0;
}
//測試arr與&arr
#include <iostream>
int main(){
int arr[2]={1,2};
std::cout << arr << " : " << *(arr) << std::endl << " ";
std::cout << arr+1 << " : " << *(arr+1) << std::endl;
std::cout << &arr << " : " << *(&arr) << std::endl << " ";
std::cout << &arr+1 << " : " << *(&arr+1) << std::endl;
int *p=arr;
int *pp=&arr; //11行
return 0;
}