树、二叉树、查找算法总结

一,思维导图

二,重要的概念笔记

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型对称,需依次进行右旋处理和左旋处理 。

posted @ 2020-04-26 20:19  熊正雄  阅读(296)  评论(0编辑  收藏  举报