1.树的基本概念
(1) 节点的度:一个节点含有的子树个数
例:图中A节点的度为1,D节点的度为2
(2) 树的度:一棵树中,最大的节点的度为树的度
例:图中二叉树的度为2
(3) 叶节点:也称为终端节点,度为零的节点
例:图中二叉树的叶节点有C、G、F
(4) 分支节点:也称为非终端节点,度不为零的节点
例:图中二叉树的分支节点为A、B、D、E
(5) 节点的层次:从根开始定义起,根为第一层,根的子节点为第二层,以此类推。
例:图中二叉树的层次为5层
(6)深度:对于任意节点n,n的深度为从根到n的唯一路径长。
例:图中二叉树的深度为5
(7)高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长。
例:图中C节点的高度为:C->B->A,即2
2.二叉树的基本概念
(1)若二叉树的层次从0开始,则在二叉树的第i层最多有2i个节点
(2)高度为k的二叉树最多有[2^(k+1)]-1个节点
(3)如果二叉树叶结点个数为n0,度为2的非叶节点个数为n2,则有n0=n2+1
(4)满二叉树:每一层的节点达到其最大值
(5)完全二叉树:若二叉树高度为h,则共有h+1层,除第h层外,其他各层的节点数都达到最大个数,第h层从右向左连续缺若干节点
*具有n个节点的完全二叉树的高度为[log(n+1)]-1
3.二叉树基本操作
//1.创建节点
#include<iostream>
using namespace std;
#define END "#"//结束标志
//使用二叉链表方式定义二叉树结构
typedef char ElemType;
typedef struct BtNode
{
BtNode* leftchild;//左孩子
BtNode* rightchild;//右孩子
ElemType data;//数据域
}BtNode,*BinaryTree;
//2.创建二叉树
//递归创建
BtNode* BuyNode//购买节点
{
BtNode* s=(BtNode*)malloc(sizeof(BtNode*));
if(NULL==s) exit(EXIT_FAILURE);
memset(s,0,sizeof(BtNode*));//清零
return s;
}
BtNode* CreateTree()
{
ElemType ch;
BtNode* s = NULL;
cin >> ch;
if(ch != END)
{
s=BuyNode();
s->data=ch;
s->leftchild=CreateTree();
s->rightchild=CreateTree();
}
return s;
}
//中序后序创建二叉树
int FindIs(char* is,char value,int n)
{
int pos=-1;
for(int i=0;i<n;i++)
{
if(is[i]==value)
{
pos=i;
break;
}
}
return pos;
}
BtNode* CreateILTree(char* is,char* ls,int n)
{
BtNode* s=NULL;
if(is!=NULL && ls!=NULL && n>0)
{
s=BuyNode();
s->data=ls[n-1];//后序的最后一个数为二叉树根节点
int pos=FindIs(is,ls[n-1],n);
if(pos==-1) exit(EXIT_FAILURE);
s->leftchild=CreateILTree(is,ls,pos);
s->rightchild=CreateILTree(is+pos+1,ls+pos,n-pos-1);
}
return s;
}
//3.递归遍历二叉树
//先序遍历
void PreOrder(BtNode* ptr)
{
if(ptr!=NULL)
{
cout<<ptr->data<<" ";
PreOrder(ptr->leftchild);
PreOrder(ptr->rightchild);
}
}
//中序遍历
void InOrder(BtNode* ptr)
{
if(ptr!=NULL)
{
InOrder(ptr->leftchild);
cout<<ptr->data<<" ";
InOrder(ptr->rightchild);
}
}
//后序遍历
void LsOrder(BtNode* ptr)
{
if(ptr!=NULL)
{
LsOrder(ptr->leftchild);
LsOrder(ptr->rightchild);
cout<<ptr->data<<" ";
}
}
//4.二叉树的深度(递归)
int BinaryTreeDepth(BtNode* ptr)
{
if (ptr == NULL) return;
else return std::max(BinaryTreeDepth(ptr->leftchild),BinaryTreeDepth(ptr->rightchild))+1;
}
//5.二叉树的结点个数(递归)
int PrintBTCount(BtNode* ptr)
{
if (ptr == NULL) return 0;
else return PrintBTCount(ptr->rightchild) + PrintBTCount(ptr->leftchild)+1;
}
调试结果