第1关:实现二叉树的创建
#include "binary_tree.h"
BiTreeNode* CreatBiTree(char* s, int &i, int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
BiTreeNode* T;
if(i<=len && s[i]=='#')
{
i++;
T=NULL;
}
else
{
T=(BiTreeNode*)malloc(sizeof(BiTreeNode));
T->data=s[i++];
T->left=CreatBiTree(s,i,len);
T->right=CreatBiTree(s,i,len);
}
return T;
/********** End **********/
}
void InOrder(BiTreeNode* root)
// 二叉树的中序遍历
// 参数:二叉树根节点root
// 输出:中间没有空格,末尾不换行。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(root!=NULL)
{
InOrder(root->left);
printf("%c",root->data);
InOrder(root->right);
}
/********** End **********/
}
第2关:计算二叉树的深度和节点个数
#include "binary_tree.h"
int GetTreeDepth(BiTreeNode* root)
// 计算该二叉树的深度
// 参数:二叉树根节点root
// 返回:二叉树的深度
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int m,n;
if(root==NULL)
{
return 0;
}
else{
m=GetTreeDepth(root->right);
n=GetTreeDepth(root->left);
if(m>n)
return m+1;
else
return n+1;
}
/********** End **********/
}
int GetNodeNumber(BiTreeNode* root)
// 计算该二叉树的总节点个数
// 参数:二叉树根节点root
// 返回:二叉树的总节点个数
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(root==NULL)
{
return 0;
}
else
return GetNodeNumber(root->left)+GetNodeNumber(root->right)+1;
/********** End **********/
}
int GetLeafNodeNumber(BiTreeNode* root)
// 计算该二叉树的叶子节点个数
// 参数:二叉树根节点root
// 返回:二叉树的叶子节点个数
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(root==NULL)
return 0;
else if(root->left==NULL&&root->right==NULL)
return 1;
else
return GetLeafNodeNumber(root->left)+GetLeafNodeNumber(root->right);
/********** End **********/
}
第3关:递归实现二叉树左右子树交换
#include "binary_tree.h"
BiTreeNode* BiTreeChange(BiTreeNode* root)
// 实现二叉树左右子树的交换(递归法)
// 参数:二叉树根节点root
// 返回:二叉树
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int max=1000;
BiTreeNode* s[max];
int k=0;
s[k]=0;
if(root)
{
k++;
s[k]=root->left;
root->left=root->right;
root->right=s[k];
root->left=BiTreeChange(root->left);
root->right=BiTreeChange(root->right);
k++;
}
return root;
/********** End **********/
}
void PreOrder(BiTreeNode* root)
// 二叉树的前序遍历
// 参数:二叉树根节点root
// 输出:二叉树的前序遍历,中间没有空格,末尾不换行。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(root)
{
printf("%c",root->data);
PreOrder(root->left);
PreOrder(root->right);
}
/********** End **********/
}
第4关:非递归实现二叉树左右子树交换
#include "binary_tree.h"
BiTreeNode* BiTreeChangeStack(BiTreeNode* root)
// 实现二叉树左右子树的交换(栈实现)
// 参数:二叉树根节点root
// 返回:二叉树
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
stack<BiTreeNode*> s;
BiTreeNode *temp=NULL,*node=root;
if(root==NULL)
return NULL;
s.push(root);
while(!s.empty())
{
temp=node->left;
node->left=node->right;
node->right=temp;
if(node->right)
{
s.push(node->right);
}
if(node->left)
{
node=node->left;
}else{
node=s.top();
s.pop();
}
}
return node;
/********** End **********/
}
void PostOrder(BiTreeNode* root)
// 二叉树的后序遍历
// 参数:二叉树根节点root
// 输出:二叉树的后序遍历,中间没有空格,末尾不换行。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(root->left)
{
PostOrder(root->left);
}
if(root->right)
{
PostOrder(root->right);
}
printf("%c",root->data);
/********** End **********/
}
第5关:层次遍历二叉树
#include "binary_tree.h"
void HierarchyOrder(BiTreeNode* root)
// 二叉树的层次遍历(队列实现)
// 参数:二叉树根节点root
// 输出:二叉树的层次遍历,中间没有空格,末尾不换行。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
queue<BiTreeNode*> q;
if(root!=NULL)
{
q.push(root);
}
while(!q.empty())
{
printf("%c",q.front()->data);
if(q.front()->left != NULL)
{
q.push(q.front()->left);
}
if(q.front()->right != NULL)
{
q.push(q.front()->right);
}
q.pop();
}
/********** End **********/
}