二叉树
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;
}