一、二叉树是什么?
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。
二、如何遍历?
首先你得认识遍历,遍历方法有四种:
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
层序遍历:从上到下
最后一种应该没人用吧~~
三、代码
#include<stdio.h>
#include<iostream>
typedef int TElemType;
//二叉树的二叉链表存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
//先序遍历建立二叉树
void CreateBiTree(BiTree &T)
{
char ch;
scanf("%c", &ch);
if (ch == '#')
{
T = NULL;
}
else
{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历复制二叉树
void Copy(BiTree T, BiTree &NewT)
{
if (T == NULL) //空树 ,递归结束
{
NewT = NULL;
return;
}
else
{
NewT = new BiTNode;
NewT->data = T->data; //复制
Copy(T->lchild, NewT->lchild); //递归复制左子树
Copy(T->rchild, NewT->rchild); //递归复制右子树
}
}
// 计算二叉树的深度
// 二叉树的深度为左右子树深度的较大者加1。
int Depth(BiTree T)
{
int m, n;
if (T == NULL)
{
return 0;
}
else
{
m = Depth(T->lchild);
n = Depth(T->rchild);
if (m > n) return (m + 1);
else return (n + 1);
}
}
//计算二叉树结点的个数
//二叉树的结点数为:左子树的结点数+右子树的结点数+1
int NodeCount(BiTree T)
{
if (T == NULL)
{
return 0;
}
else
{
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
}
//先序遍历输出
void PreOrderTraverse(BiTree T)
{
if (T)
{
printf("%c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历输出
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->lchild);
printf("%c", T->data);
InOrderTraverse(T->rchild);
}
}
//后序遍历输出
void PostOrderTraverse(BiTree T)
{
if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c", T->data);
}
}
int main()
{
BiTree T;
int depth, node;
printf("请输入要建立的二叉树的先序序列,用#表示空树(单个字符表示结点):");
CreateBiTree(T);
depth = Depth(T);
printf("树的深度为:%d\n", depth);
node = NodeCount(T);
printf("树的节点个数为:%d\n", node);
//遍历
printf("\n先序遍历:");
PreOrderTraverse(T);
printf("\n中序遍历:");
InOrderTraverse(T);
printf("\n后序遍历:");
PostOrderTraverse(T);
printf("\n");
}
886!