二叉树及其应用

//二叉树注意递归的思想的应用
实现二叉树的创建–计算二叉树的深度和节点个数–递归实现二叉树左右子树交换–非递归实现二叉树左右子树交换–层次遍历二叉树

struct BiTreeNode {
    char data;              //  树节点元素
    BiTreeNode* left;       //  左子树指针
    BiTreeNode* right;      //  右子树指针
};

1.利用先序遍历创建二叉树,参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。返回:二叉树
//先创建根节点,在递归创建左子树节点,若遇到’#’,则表示到叶子节点,回溯父节点并创建有右子树节点
2.二叉树的中序遍历
// 参数:二叉树根节点root
// 输出:中间没有空格,末尾不换行。
3.计算该二叉树的深度
// 参数:二叉树根节点root
// 返回:二叉树的深度
(二叉树的深度指的是二叉树中最大的结点层数。)
4.计算该二叉树的总节点个数
// 参数:二叉树根节点root
// 返回:二叉树的总节点个数
5.计算该二叉树的叶子节点个数
// 参数:二叉树根节点root
// 返回:二叉树的叶子节点个数

BiTreeNode* CreatBiTree(char* s, int &i, int len)
{
BiTreeNode *root;
char a=s[i++];
if(a='#'||i>=len)
{root=NULL;}
else
{
root=new BiTreeNode(a);
root->left=CreatBiTree(s,i,len);
root->right=CreatBiTree(s,i,len);
}
return root;
}
void InOrder(BiTreeNode* root)
{if(root==NULL)
return ;
else{
InOrder(root->left);
printf("%c",root->data);
InOrder(root->right);
}}
int GetTreeDepth(BiTreeNode* root)
{if(root==NULL)
return 0;
else return 1+max(GetTreeDepth(root->right),GetTreeDepth(root->left));
}
int GetNodeNumber(BiTreeNode* root)
{if(root==NULL)
return 0;
else return 1+GetNodeNumber(root->left)+GetNodeNumber(root->right);
}
int GetLeafNodeNumber(BiTreeNode* root)
{if(root==NULL)
return 0;
else if(root->left==NULL&&root->right==NULL)return 1;
else return GetLeafNodeNumber(root->left)+GetLeafNodeNumber(root->right);
}

6.实现二叉树左右子树的交换(递归法)
// 参数:二叉树根节点root
// 返回:二叉树
7.二叉树的前序遍历
// 参数:二叉树根节点root
// 输出:二叉树的前序遍历,中间没有空格,末尾不换行。
8.二叉树的层次遍历(队列实现)
// 参数:二叉树根节点root
// 输出:二叉树的层次遍历,中间没有空格,末尾不换行。
9.实现二叉树左右子树的交换(栈实现)
// 参数:二叉树根节点root
// 返回:二叉树
10.二叉树的后序遍历
// 参数:二叉树根节点root
// 输出:二叉树的后序遍历,中间没有空格,末尾不换行。

BiTreeNode* BiTreeChange(BiTreeNode* root)
{if(root==NULL)
   return NULL;
   else {
   BiTreeNode* node_left=BiTreeChange(root->left);
  BiTreeNode* node_right=BiTreeChange(root->right);
    root->left=node_right;
    root->right=node_left;
    return root;
}
void PreOrder(BiTreeNode* root)
{if(root==NULL)return ;
    else{
    printf("%c",root->data);
    PreOrder(root->left);
    PreOrder(root->right);}
}
void HierarchyOrder(BiTreeNode* root)
{BiTreeNode*p,q[100];
int a,b;//类似队列头尾指针
p=root;
if(p!=NULL)
{a=1;b=2;q[a]=p;}
while(a!=b)
{p=q[a];
printf("%c",p->data);
if(p->left!=NULL)
{q[b]=p->left;
b=(b+1)%100;}
if(p->right!=NULL)
{q[b]=p->right;
b=(b+1)%100;}
a=(a+1)%100;}
}
BiTreeNode* BiTreeChangeStack(BiTreeNode* root)
{if(root==NULL)return NULL;
BiTreeNode* node_left=BiTreeChangeStack(root->left);
BiTreeNode* node_right=BiTreeChangeStack(root->right);
root->left=node_right;
root->right=node_left;
return root;}
void PostOrder(BiTreeNode* root)
{if(root==NULL)return ;
 PostOrder(root->left);
 PostOrder(root->right);
 printf("%c",root->data);
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尾迹双冒号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值