一,思维导图
二,重要的概念笔记
1,节点的度与树的度:结点的子树的个数称之为结点的度,在一棵树中节点度的最大值成为树的度。
2,分支结点与叶子节点:树中度部位零的结点叫分支结点,度为零的结点称之为叶子节点。
3,路径与路径长度:任意两个结点p,q有(p........q)诚p到q的一条路径,通过结点数量减一称为路径长度。
4,孩子结点,双亲结点,兄弟节点:每个结点的后继结点称为该节点的孩子结点,每个节点的前驱结点称之为双亲结点,具有相同双亲结点的结点称之为兄弟结点。
5,结点层次和树的高度:结点层次从根节点开始,根节点在第一层,树中结点层次最大的称为树的高度。
6,森林:n个互不相交的树的集合称之为森林。
7,树的结点个数等于所有的结点的度之和加一。
8,度为m的树中第i层最多有m的i-1次方个结点。
9,高度为h的m次树最多有(m的h次方-1)/(m-1)个结点。
10,具有n个结点的m次树的最小高度为log(m)[n(m-1)]层。
11,二叉树的基本运算:
先序遍历输出:
void PreorderPrintLeaves( BinTree BT )
{
if(BT){
if(BT->Left==NULL&&BT->Right==NULL)
printf(" %c",BT->Data);
PreorderPrintLeaves(BT->Left);
PreorderPrintLeaves(BT->Right);
}
}
输出度为1的结点:
void InorderPrintNodes( BiTree T)
{
if(T == NULL)
return 0;
if((T->lchild == NULL )&&( T->rchild == NULL)) return 0;
else if(T != NULL)
{
InorderPrintNodes(T->lchild);
if((T->lchild == NULL )||( T->rchild == NULL))
printf(" %c",T->data);
InorderPrintNodes(T->rchild);
}
}
求树的高度:
int GetHeight( BinTree BT )
{
int lchildh,rchildh;
if (BT == NULL) return 0;
else {
lchildh = GetHeight(BT->Left);
rchildh = GetHeight(BT->Right);
if (lchildh>=rchildh) return (lchildh+1);
else return (rchildh+1);
}
}
三,疑难问题及其解决方案
1,二叉排序树的建立,查找,插入,输出:
#include<iostream>
using namespace std;
typedef struct BSTNode
{
int data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
void InsertBST(BSTree &T,int e)
{
BSTree S;
if (!T) {
S = new BSTNode;
S->data = e;
S->lchild = NULL;
S->rchild = NULL;
T = S;
}
else if(e > T->data) {
InsertBST(T->rchild,e);
}
else if(e < T->data) {
InsertBST(T->lchild,e);
}
}
BSTree SearchBST(BSTree T,int key)
{
if (!T||T->data == key) {
return T;
}
else if (key > T->data) {
return SearchBST(T->rchild,key);
}
else if (key < T->data) {
return SearchBST(T->lchild,key);
}
}
void CreatBST(BSTree &T)
{
T = NULL;
int a[100],i;
cin>>a[0];
for (i=0; a[i]!=-1; i++) {
InsertBST(T,a[i]);
cin>>a[i+1];
}
}
void InOrderTraverse(BSTree T)
{
if (T) {
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
}
int main ()
{
int key;
BSTree T;
CreatBST(T);
InOrderTraverse(T);
cin>>key;
if (SearchBST(T,key)) {
if (SearchBST(T,key)->lchild) {
cout<<"左孩子: "<<SearchBST(T,key)->lchild->data<<"\n";
}
else {
cout<<"无左孩子\n";
}
if (SearchBST(T,key)->rchild) {
cout<<"右孩子; "<<SearchBST(T,key)->rchild->data<<"\n";
}
else {
cout<<"无右孩子\n";
}
}
else {
cout<<"查找失败!";
}
return 0;
}
2,平衡二叉树的调整:
LL型: LL型指的是在最小失衡子树的左孩子的左子树上插入了新的结点。例如: 在B点的左子树上插入一个节点。插入后B点的左子树的平衡因子变为1,A节点的平衡因子变为了2。这样可以看出来A节点为根节点的子树是最小不平衡子树。调整时,将A的左孩子B向右旋转代替A称为原来不平衡子树的根节点,将A的节点右下旋转称为B的右子树的根节点,而B的原右子树变为A的左子树。
RR型: 对于RR型,正好与LL型对称,对以A为根的最小失衡子树进行逆时针旋转
LR型: 在A节点的左孩子的右子树上插入节点,使得A节点的平衡因子由1变为了2而引起的不平衡所进行的调整的操作。 先转换为RR型或LL型,基本方法不变。
RL型: RL型和LR型对称,需依次进行右旋处理和左旋处理 。
原文:https://www.cnblogs.com/xzxzxzx/p/12781993.html