【树、二叉树】树的遍历
树的遍历:
先序(根左右):先输出根节点,再递归输出左右子节点
中序(左根右):先递归输出左子节点,再输出根节点,再输出右子节点
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; }
结合图示查看验算结果
先序遍历:
中序遍历: