二叉树的递归遍历
/*
采用双链表作为存贮结构,完成二叉树的建立;给出先序、中序、和后序遍历算法;给出求二叉树所有结点个数、叶子结点个数及树高度的算法),并设计一棵二叉树测试运行效果。
1)构建要求:给出二叉树扩充的先序序列,唯一地构造一棵二叉树。
2)数据要求:树中每个结点的数据类型设定为整型。
3)遍历算法要求:三种遍历都采用递归算法。
*/
#include<iostream>
#include<stdio.h>
#define MAX 100
typedef struct BTreeNode {
int data;
BTreeNode *Lchild, *Rchild;
}Bnode, *ptr;
class BTree
{
public:
ptr getRoot()
{
return root;
}
void Create() //构造二叉树的对外接口
{
createBTree(root);
}
void inOrder(ptr tree); //中序遍历
void preOrder(ptr tree); //先序遍历
void postOrder(ptr tree); //后序遍历
int BTreeSize(ptr tree); //结点个数
int BTreeLeaves(ptr tree); //叶子结点
int BTreeHeight(ptr tree); //树高
private:
ptr root;
void createBTree(ptr &tree); //根据扩充序列构建二叉树
};
void BTree::inOrder(ptr tree)
{
if (!tree)
return;
// 遍历左子树
inOrder(tree->Lchild);
// 打印根节点
cout << tree->data << " ";
// 遍历右子树
inOrder(tree->Rchild);
}
void BTree::preOrder(ptr tree)
{
if (!tree)
return;
// 打印根节点
cout << tree->data << " ";
// 遍历左子树
preOrder(tree->Lchild);
// 遍历右子树
preOrder(tree->Rchild);
}
void BTree::postOrder(ptr tree)
{
if (!tree)
return;
// 遍历左子树
postOrder(tree->Lchild);
// 遍历右子树
postOrder(tree->Rchild);
// 打印根节点
cout << tree->data << " ";
}
int BTree::BTreeSize(ptr tree)
{
if (!tree)
return 0;
// 遍历左右子树到底
// 每返回一个+1, Size = 左右子树的和 + 1
return BTreeSize(tree->Lchild)+ BTreeSize(tree->Rchild) + 1;
}
int BTree::BTreeLeaves(ptr tree)
{
// 根节点不算叶子结点
if (!tree) return 0;
// 左右子树都为NULL
if (tree->Lchild == NULL && tree->Rchild == NULL)
return 1;
else
return BTreeLeaves(tree->Lchild) + BTreeLeaves(tree->Rchild);
}
int BTree::BTreeHeight(ptr tree)
{
// 左右子树每遍历一次+1,最后取最大值+1
if (!tree)
return 0;
return (BTreeHeight(tree->Lchild) > BTreeHeight(tree->Rchild)) ? BTreeHeight(tree->Lchild) + 1 : BTreeHeight(tree->Rchild) + 1;
}
ptr NewNode(int data)
{
ptr newNode = new Bnode;
newNode->data = data;
newNode->Lchild = NULL;
newNode->Rchild = NULL;
return newNode;
}
//如果结点data为0, 则为空结点
void BTree::createBTree(ptr &tree)
{
int data;
cin >> data;
if (data == 0)
{
//结点等于零, 为空结点
tree = NULL;
return;
}
else
{
tree = NewNode(data);
createBTree(tree->Lchild);
createBTree(tree->Rchild);
}
}
void main()
{
cout << "请输入一个扩充序列: " << endl;
BTree tree =BTree();
tree.Create();
cout << "扩充完成" << endl;
cout << "先序遍历:";
tree.preOrder(tree.getRoot());
cout << endl;
cout << "中序遍历:";
tree.inOrder(tree.getRoot());
cout << endl;
cout << "后序遍历:";
tree.postOrder(tree.getRoot());
cout << endl;
cout << "全部结点个数:";
cout << tree.BTreeSize(tree.getRoot());
cout << endl;
cout << "叶子结点个数: ";
cout << tree.BTreeLeaves(tree.getRoot());
cout << endl;
cout << "树的深度:";
cout << tree.BTreeHeight(tree.getRoot());
cout << endl;
getchar();
getchar();
}