数据结构之二叉树基本操作

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;
}

调试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值