建立一颗二叉树,先序遍历二叉树,删除整棵树,复制一棵二叉树
下面就是相关代码:
//功能实现:建立一颗二叉树,先序遍历二叉树,删除整棵树,复制一棵二叉树
#include<stdio.h>
#include<stdlib.h>
//定义二叉树节点
typedef struct TreeNode
{
int data;
struct TreeNode* l_child;
struct TreeNode* r_child;
}TreeNode;
TreeNode* creatNode(int val)
{
TreeNode* Node = (TreeNode*)malloc(sizeof(TreeNode));
Node->data = val;
Node->l_child = NULL;
Node->r_child = NULL;
return Node;
}
//创建二叉树
TreeNode* buildBitree()
{
int val;
printf("请输入节点的值(-1代表空节点):");
scanf("%d", &val);
if (val == -1)
return NULL;
TreeNode* root = creatNode(val);
printf("请输入 %d 的左子节点:\n", val);
root->l_child = buildBitree();
printf("请输入 %d 的右子节点:\n", val);
root->r_child = buildBitree();
return root;
}
//先序遍历
void preorderTraversal(TreeNode* root)
{
if (root == NULL)
return;
printf("%d\t", root->data);
preorderTraversal(root->l_child);
preorderTraversal(root->r_child);
}
//删除二叉树
void freeNode(TreeNode* Node)
{
if (Node == NULL)
return;
freeNode(Node->l_child);
freeNode(Node->r_child);
free(Node);
}
void deleteBitree(TreeNode** root)
{
if (*root == NULL)
return;
freeNode((*root)->l_child);
freeNode((*root)->r_child);
free(*root);
*root = NULL;
}
void copy(TreeNode** dest, TreeNode* src)
{
if (src == NULL)
{
*dest = NULL;
return;
}
else
{
*dest = creatNode(src->data);
copy(&(*dest)->l_child, src->l_child);
copy(&(*dest)->r_child, src->r_child);
}
}
int main()
{
printf("动态建立二叉树示例:\n");
TreeNode* root = buildBitree();
printf("前序遍历结果:");
preorderTraversal(root);
TreeNode* Newroot;
copy(&Newroot, root);
printf("前序遍历结果:");
preorderTraversal(Newroot);
deleteBitree(&root);
deleteBitree(&Newroot);
return 0;
}
因为二叉树的递归定义,因此我们也可以利用递归函数建立一棵二叉树,但是需要注意到的是,函数传递的参数,到底是传一级指针还是二级指针,看你要对它的操作而定。具体来说,如果你要修改指针的指向就要传二级指针,如果仅仅是遍历等操作,不对实参做操作,传一级指针就行。
代码示例:
算法---计算二叉树的深度、节点总数、叶子节点数
代码:
//计算二叉树的深度,比较左子树和右子树的深度,返回更大的加一
int Depth(TreeNode* T)
{
if (T == NULL)
return 0;
else
{
int m = Depth(T->l_child);
int n = Depth(T->r_child);
if (m > n) return (m + 1);
else return (n + 1);
}
}
//计算二叉树节点总数
int NodeCount(TreeNode* T)
{
if (T == NULL) return 0;
else
return NodeCount(T->l_child) + NodeCount(T->r_child) + 1;
}
//计算叶子节点
int LeafCount(TreeNode* T)
{
if (T == NULL)
return 0;
if (T->l_child == NULL && T->r_child == NULL)
return 1;
else
return LeafCount(T->l_child) + LeafCount(T->r_child);
}
执行结果: