树,一种非线性结构
<1>有且只有一个节点无前驱—根节点
<2>有多个节点没有后继—叶子节点
<3>除根,叶子节点外的其余节点,向上只有一个前驱,向下有多个后继
节点的度:一个节点的子女节点的个数
树的度:树中度值最大的节点的度
K叉树,即树的度值为K
本文主要以二叉树为主:
<1>一棵非空二叉树的叶子节点总比双分支节点多一个
即,总节点个数=双分支节点数+单分支节点数+叶子节点数
=2倍的双分支节点数+单分支节点数+1
<2>对二叉树按层编号 0,1,2,3…..
第i层,最多有2^(i-1)
满二叉树:每一层都有 2^(i-1)个节点
<3> 一棵h层的满二叉树的节点个数为2^(h-1)
<4>完全二叉树:一棵h层的完全二叉树,前h-1层是满的,最后一层连续 缺失右边的节点,满二叉树是一个特殊的完全二叉树,并完全二叉树的节点区间2^(h-1) -1
typedef struct node{
int data;
struct node *left;
struct node *right;
}BTNode;
创建一棵二叉树:
BTNode *CreateBTree(int D[],int n)
{
BTNode *root,*q,*p,*c;
int i;
root=(BTNode *)malloc(sizeof(BTNode));
root->data=D[0];
root->left=root->right=NULL;
for( i=1;i<n;++i)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=D[i];
p->left=p->right=NULL;
c=root;
while(c)
{
q=c;
if(p->data<c->data)
c=c->left;
else
c=c->right;
}
if(p->data>q->data)
q->right=p;
else
q->left=p;
}
return root;
}
对二叉树进行遍历:
前序遍历:
void Fnorder(BTNode *root)
{
if(root)
{
printf("%3d",root->data);
Fnorder(root->left);
Fnorder(root->right);
}
}
中序遍历:
void Inorder(BTNode *root)
{
if(root)
{
Inorder(root->left);
printf("%3d",root->data);
Inorder(root->right);
}
}
后序遍历:
void Forder(BTNode *root)
{
if(root)
{
Forder(root->left);
Forder(root->right);
printf("%3d",root->data);
}
}
按层遍历:
int print_level(BTnode *root,int level){
if(!root||level<0){
return 0;
}
if(0==level){
printf("%d,",root->value);
return 1;
}
return print_level(root->left,level-1)+print_level(root->right,level-1);
}
二叉树的叶子节点:
int countleafnode(BTNode *root)
{
if(!root) return 0;
else return countleafnode(
root- >left)+countleafnode(root->right)
+(!root->left&&!root->right);
}
二叉树的双分支节点:
int countdounode(BTNode *root)
{ if(!root) return 0;
else return countdounode(root->left)+countdounode(root->right)+(root->left&&root->right);
}
二叉树的度:
int CountDu(BTnode *root){
if(!root) return 0;
int left=CountDu(root->left);
int right=CountDu(root->right);
return left>right?left+1:right+1;
}
生成一个镜像二叉树:
void CreateBTreeN(BTNode *root){
BTNode *t;
if(root){
t=root->left;
root->left=root->right;
root->right=t;
CreateBTreeN(root->left);
CreateBTreeN(root->right);
}
}
判断是否为平衡二叉树:
bool Isblance(BTnode *root,int *depth){
if(root==NULL){
*depth=0;
return true;
}
int left,right;
if(Isblance(root->left,&left)&&Isblance(root->right,&right)){
int diff=left-right;
if(diff<1&&diff>=-1){
*depth=1+(left>right?left:right);
return true;
}
}
return false;
}
本文深入探讨了二叉树的结构特性,包括度、节点类型、遍历方式等核心概念,同时展示了如何创建、遍历以及操作二叉树实例。详细介绍了二叉树的层次遍历、叶子节点计数、双分支节点计数和度计算等实用技巧,旨在为读者提供全面的二叉树知识体系。
2218

被折叠的 条评论
为什么被折叠?



