树 - 二叉树的遍历和初始化

二叉树

 

                 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;
}

 

 

    

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值