【树、二叉树】树的遍历

树的遍历:

先序(根左右):先输出根节点,再递归输出左右子节点

中序(左根右):先递归输出左子节点,再输出根节点,再输出右子节点

tips:左右子节点分别为2i+1和2i+2;

先序遍历的代码:

void preOrder(int *arr,int i)
{
    //设计递归出口
    if(i>=len(arr))//其中len是自定义的计算数组长度的函数 
        return;
    printf("%d",arr[i]);//先输出根节点
    preOrder(arr,2*i+1);//再递归调用输出左结点
    preOrder(arr,2*i+2);//再递归调用输出右结点; 
}

中序遍历的代码:和先序思路一样,只需要交换一下输出顺序即可

void inOrder(int *arr,int i)
{
    //设计递归出口
    if(i>=len(arr))//其中len是自定义的计算数组长度的函数 
        return;
    inOrder(arr,2*i+1);//先递归调用输出左结点
    printf("%d",arr[i]);//再输出根节点
    inOrder(arr,2*i+2);//再递归调用输出右结点; 
}

完整代码:

#include<stdio.h>
void preOrder(int *arr,int i);
void inOrder(int *arr,int i);
int len(int *a); 
int main()
{
    int arr[10]={78,56,34,43,4,1,15,2,23};
    preOrder(arr,0);
//    inOrder(arr,0);
    return 0;
}
void preOrder(int *arr,int i)
{
    //设计递归出口
    if(i>=len(arr))//其中len是自定义的计算数组长度的函数 
        return;
    printf("%d ",arr[i]);//先输出根节点
    preOrder(arr,2*i+1);//再递归调用输出左结点
    preOrder(arr,2*i+2);//再递归调用输出右结点; 
}
void inOrder(int *arr,int i)
{
    //设计递归出口
    if(i>=len(arr))//其中len是自定义的计算数组长度的函数 
        return;
    inOrder(arr,2*i+1);//先递归调用输出左结点
    printf("%d ",arr[i]);//再输出根节点
    inOrder(arr,2*i+2);//再递归调用输出右结点; 
}

int len(int *a)
 {
     int len=0;
     int i=0;
     while(a[i]!='\0')
     {
         len++;
         i++;
     }
     return len;
 }

结合图示查看验算结果

先序遍历:

中序遍历:

posted @ 2020-02-25 16:07  美好事物  阅读(175)  评论(0编辑  收藏  举报