//二叉树注意递归的思想的应用
实现二叉树的创建–计算二叉树的深度和节点个数–递归实现二叉树左右子树交换–非递归实现二叉树左右子树交换–层次遍历二叉树
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);
}