一开始觉得二叉树的代码很简单,
后来仔细研究发现,
原来对递归的运用还能这么妙啊!
//vs2017
#include<iostream>//A B C 0 0 0 D E 0 F 0 0 G 0 0
using namespace std;
typedef struct Node
{
char data;
struct Node *l, *r;//左孩子右孩子的地址;
}*bitTree;
void createBitTree(bitTree &tree)//加引用号,表示是在原地址上做了这件事,不会随函数消逝
{
char c;
cin >> c;
if (c == '0') tree = NULL;
else
{
tree = new Node;//利用new在堆区开辟动态内存空间,首地址用tree接受
tree->data = c;
createBitTree(tree->l);
createBitTree(tree->r);
}
}
void preorderTraverse(bitTree tree)//先序遍历
{
if (tree != NULL)
{
cout << tree->data << " ";//根
preorderTraverse(tree->l);//左
preorderTraverse(tree->r);//右
}
}
void inorderTraverse(bitTree tree)//中序遍历
{
if (tree != NULL)
{
inorderTraverse(tree->l);//左
cout << tree->data << " ";//根
inorderTraverse(tree->r);//右
}
}
int leaf(bitTree tree)//叶子节点个数
{
if (tree == NULL) return 0;
if (tree->l == NULL && tree->r == NULL) return 1;
return leaf(tree->l) + leaf(tree->r);
}
int deepth(bitTree tree)//二叉树深度
{
if (tree == NULL) return 0;
int x = deepth(tree->r);
int y = deepth(tree->l);
return (x > y ? x : y) + 1;
}
int main()//A B C 0 0 0 D E 0 F 0 0 G 0 0
{
cout << "输入节点" << endl;
bitTree tree;
createBitTree(tree);
cout << "先序遍历" << endl;
preorderTraverse(tree);
cout << endl;
cout << "中序遍历" << endl;
inorderTraverse(tree);
cout << endl;
cout << "叶子结点数" << leaf(tree)<< endl;
cout << "深度" << deepth(tree)<< endl;
return 0;
}