基本概念
1.树的基本概念:
除了线性结构的另外一种数据结构,一堆元素的集合,有一个结点叫根结点…
结点的度:结点拥有字树的个数
结点的层次:根节点到该结点的分支数
树的度:树中所有结点最大的度为该树的度
树的深度:结点层次最大的个数为树的深度
2.二叉树的基本概念和性质
二叉树:是结点的一个有限集合,该集合为空,或者由一个根结点加上两颗分别称为坐子树和右子树的二叉树组成
特点:每个结点最多有两棵子树,且有左右之分,不能颠倒次序
满二叉树:所有分支都有左右子树
完全二叉树:最后介个结点是空的
二叉树的性质:
二叉树的操作
1.创建二叉树、
递归创建二叉树(利用前序创建,先创建根结点,在创建左子树,在创建右子树)
给一个数组,创建二叉树的难点在于一个简单的前序遍历顺序不能推出一个二叉树,要给定“#”,否则递归就是单支树了
2.二叉树的高度
1)空树返回0
2)判断左右子树的高度
int highBT(BTree* pRoot) //树的高度
{
int l_hight = 0, r_hight = 0;
if (NULL == pRoot) //空树
return 0;
l_hight = highBT(pRoot->_left); //左子树的高度
r_hight = highBT(pRoot->_right); //右子树
return l_hight > r_hight ? l_hight+1 : r_hight+1; //左右子树中高度大的
}
3.判断两棵树是否相同
思路:
1.都为空树,则相同
2.有一个为空则不同(先考虑特殊情况)
3.左子树和它的左子树一样 && 右子树和右子树一样,则两棵树一样
bool IsSame(struct BT*p,struct BT*q)//判断两颗树是否相同
{
if (p == NULL &&q == NULL)
return true;
if (NULL == p || NULL == q)
{
return false;
}
return IsSame(p->left, q->left) && IsSame(p->right, q->right);
}
3.判断是否为对称二叉树(镜像)
4.判断一棵树是否为另外一棵树的子树
二叉树的遍历,递归和非递归
- 三种遍历
- 层序遍历
- 二叉树的非递归遍历----用循环模拟递归
前序:
void InOrderNor(PBTNode pRoot) //中序
{
Stack s;
BTnode *pcur = pRoot; //树的根节点
if (NULL == pRoot)
return NULL;
InitStack(&s);
//1.找以pcur为根节点树的的最左侧结点,并保存路径经过的结点,pcur一直在变
while (pcur|| !stackempty(&s)) //栈不空
{
while (pcur)
{
stackpush(&s, pcur);
pcur = pcur->left;
}
pcur = StackTop(&s); //栈顶,循环第二轮就取到了B,依次到A
stackpop(&s);
printf("%c", pcur->data); //以上找到了最左侧,还得判断最左侧 是否有右孩子(子树)
pcur = pcur->right; //右可能不存在, 里面的while就进不去了
}
stackdestory(&s);
}
后序-----和中序很像(两者类似)