您的位置:首页 > 其它

深入浅出理解[二叉树的构建、先中后序遍历、树的深度、左右子树互换]

2014-09-16 11:53 288 查看
二叉树本来就是递归定义的,如果对递归还不是特别了解,建议看一下《001.深入浅出解释[递归]》

写一个递归函数很简单,只需要记住下面2点:

1、递归中止条件:对于二叉树来说一般是node==null的时候判断到了叶子结点

2、递归函数:;描述一个中间过程,然后用代码实现,调用自身的时候传递的参数就是你想要递归的方式。

下面的代码就是一个二叉树的创建、先中后序遍历、树的深度、左右子树的互换的过程

#include<stdio.h>

//定义二叉树的结点
struct treeNode{
char data;
treeNode *left; // 指向左孩子结点
treeNode *right; // 指向右孩子结点
};

//创建一颗二叉树
treeNode*creatBinaryTree(char a[],int
pos,int length){
treeNode *node =NULL;
// 边界条件
if(pos > length|| a[pos] =='0'){
return
NULL;
}
node =new
treeNode;
node->data = a[pos];
// 递归创建
node->left =creatBinaryTree(a,2*pos,
length);
node->right =creatBinaryTree(a,2*pos
+1, length);

return node;
}

//前序遍历二叉树
voidpreOrderScanBinary(treeNode *node){
// 边界条件(直到结点不存在)
if(node) {
// 打印根结点
printf("%c ",node->data);
// 递归打印左右子树
preOrderScanBinary(node->left);
preOrderScanBinary(node->right);
}
}

//中序遍历
voidinOrderScanBinary(treeNode *node){
if(node) {
inOrderScanBinary(node->left);
printf("%c ",node->data);
inOrderScanBinary(node->right);
}
}

//后序遍历
voidpostOrderScanBinary(treeNode *node){
if(node) {
postOrderScanBinary(node->left);
postOrderScanBinary(node->right);
printf("%c ",node->data);
}
}

//求二叉树的深度
int binaryDepth(treeNode *node){
if(!node)
return
0;

int nLeft =binaryDepth(node->left);
// 左子树的深度
int nRight =binaryDepth(node->right);
// 有子树的深度

return nLeft>nRight ? (nLeft +1)
: (nRight +1);
// 树的深度 = max(左子树深度,右子树深度) + 1
}

//左右子树的交换
void exchangeSubTree(treeNode *node){
treeNode *tempSubTree;
if(!node) {
tempSubTree = node->left;
node->left = node->right;
node->right = tempSubTree;
exchangeSubTree(node->left);
exchangeSubTree(node->right);
}
}

int main(int argc,const
char * argv[])
{
int length;
printf("请输入数组的长度以及数组元素:");
scanf("%d",&length);
char *a =new
char[length+10];
for (int i =1;
i <= length; i++) {
scanf("%c",&a[i]);
}

// 创建一颗二叉树
treeNode *head =creatBinaryTree(a,1,length);

// 先序遍历
printf("先序遍历:");
preOrderScanBinary(head);

// 中序遍历
printf("\n中序遍历:");
inOrderScanBinary(head);

// 后序遍历
printf("\n后序遍历:");
postOrderScanBinary(head);

// 树的深度
printf("\n树的深度:%d\n",binaryDepth(head));

return
0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐