深入浅出理解[二叉树的构建、先中后序遍历、树的深度、左右子树互换]
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;
}
写一个递归函数很简单,只需要记住下面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;
}
相关文章推荐
- 八.二叉树各种操作的C语言实现 深度遍历求深度,广度遍历求深度,交换左右子树,求叶子节点数
- 二叉树 遍历|统计叶子节点|求深度|交换左右子树|查找是否存在某个特定叶子节点练习题
- 南邮 OJ 1021 二叉树复制和左右子树互换
- 数据结构 - 互换二叉树中所有结点的左右子树(C++)
- 二叉树要掌握的知识点(-)(定义、创建、先中后序遍历、求深度)
- 二叉树复制和左右子树互换
- 二叉树的创建,遍历,求高度,算出节点数,算出叶子节点数,左右子树的交换,二叉树的销毁。
- 初识树结构,简单模拟无规律的二叉树,实现二叉树的构建,计算树的深度以及三种遍历方式以及搜索删除,销毁整个树
- 二叉树的构建、层次打印、广度遍历、深度遍历、K值路径
- C++二叉树的构建及求深度,叶子数量,层次遍历
- 二叉树的构建以及深度优先遍历 广度优先遍历
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式 二叉树的遍历方式: 1、深度优先:递归,非递归实现方式 1)先序遍历:先访问根节点,再依次访问左子树和右子树 2)中序遍
- 二叉树的性质极其二叉树的构建、各种遍历以及深度宽度的求解
- 构建二叉树、二叉树的深度、广度优先遍历
- 1021-二叉树复制和左右子树互换
- 数据结构中二叉树的的存储、遍历、交换子树、统计二叉树的深度
- 二叉树复制和左右子树互换
- [java]二叉树构建、遍历、深度、平衡性
- 二叉树的java构建和三种遍历方式
- 二叉树中所有节点的左右子树相互交换 递归与非递归程序