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

一.思维导图

二.重要的概念

1.树的性质

(1)树的结点数等于所有结点的的度数之和加一
(2)度为m的树中第i层最多有m^(i-1)个结点
(3)高度为h的m次树最多有m^h-1)/m-1个结点
(4)具有n个结点的m次树的最小高度为[log_m(n(m-1)+1]

2.二叉树的性质

(1)非空二叉树的叶子结点数等于双分支结点数加1
(2)非空二叉树的第i层上最多有2^(i-1)个结点
(3)高度为h的二叉树最多有2^h-1个结点
(4)具有n个(n>0)结点的完全二叉树的高度为[log2n]+1

3.二叉树的构造

代码如下
BTree CreateBtree(string str ,int i)
{
    int len;
    BTree bt;
    bt=new TNode;
    len=str.size();
    if(i>=len||i<=0)
    {
        return NULL;
    }
    if(str[i]=='#')
    {
        return NULL;
    }
    bt->data=str[i];
    bt->lchild=CreateBTree(str,2*i);
    bt->lchild=CreateBTree(str,2*i+1);
    return bt;
}

4.二叉树的遍历

(1)先序遍历

访问根结点
先序遍历左子树
先序遍历右子树

代码如下
void PreOrder(BTnode*T)
{
    if(T)
    {
        cout<<T->data;
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

(2)中序遍历

中序遍历左子树
访问根结点
中序遍历右子树

代码如下
void InOrder(BTnode*T)
{
    if(T)
    {
        InOrder(T->lchild);
        cout<<T->data;
        InOrder(T->rchild);
    }
}

(3)后序遍历

后序遍历左子树
后序遍历右子树
访问根结点

代码如下
void PostOrder(BTnode*T)
{
    if(T)
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        cout<<T->data;
    }
}

5. 哈夫曼树

带权路径长度是从根结点到该结点之间的路径长度与该结点上权的乘积
规定哈夫曼树的左分支为0,右分支为1,则从根节点到每个叶结点所经过分支对应的0和1组成的序列便是该结点对应字符的编码,这样的编码便是哈夫曼编码

6.二叉树构造和插入

代码如下

bool InsertBST(BSTree& T, KeyType key)
{
	int i = 0;
	if (T == NULL)
	{
		T = new BSTNode;
		T->k = key;
		T->lchild = NULL;
		T->rchild = NULL;
		return true;
	}
	else if (T->k == key)
	{
		return false;
	}
	else if (T->k > key)
	{
		return InsertBST(T->lchild, key);
	}
	else
	{
		return InsertBST(T->rchild, key);
	}
}
BSTNode* CreateBST(int A[], int n)
{
	BSTree T = NULL;
	int i = 0;
	while (i < n)
	{
		InsertBST(T, A[i]);
		i++;
	}
	return T;
}

7.平衡二叉树的调整:LL,RR,LR,RL型调整

8.B_树特点

(1)树中每个结点最多有m课子树(最多有m-1关键字)
(2)若根节点不是叶子结点,则根节点最多有两棵子树
(3)除根节点外,所有非叶子结点最少含有m/2课子树(最少有m/2-1关键字)

9.哈希函数注要构造方法

除留余数法:

h(k)=k mod p(mod为求余运算,p<=m)
其中p取不大于m的素数

哈希冲突解决方法

线性探测法:是从发生冲突的地址开始,依次探测下一个地址,直到找到下一个空闲单元为止
平方探测法:探测地址为d+12+d-12+d-22+d+22....直到找到下一个空闲单元为止
拉链法:把所有同义词用单链表连接起来的方法

三.疑难问题与解决方案

1.二叉树的构造问题

代码如下
void CreateBiTree(BiTree &T) 、
{、
char ch;       
scanf("%c\n",&ch);     
if( ch == "#")
{
 T == NULL;
}
else
{
    T = (BiTreeNode *)malloc(sizeof(BiTreeNode))
    if (T == NULL) return;         
    T->data = ch;                   
    CreateBiTree(T->lchild);      
    CreateBiTree(T->rchild);     

} 

这中方法构造二叉树并不严谨,如果结点为#ABCD#EF#G##H##I要构造二叉树,那么只会构造一个空树。
要构造一个不为空的树,就必须把第一个#舍弃,所以上面这种构造算法并不严谨

2.二叉树结点之间的计算问题

有时候有些题目会让我们计算叶子节点或者是结点的度,如果我们不清楚它们之间的关系的话就会难以下手,
一定要记住完全二叉树的叶子结点只会出现在下面两层
如果设叶子结点数为n0,单分支结点数为n1.双分子结点数为n2
常用的关系式为
n0=n2+1, n=n1+n2+n3
所有结点度之和=n-1, 所有结点度之和=n1+2n2

3.二叉树的遍历

有时候先序遍历,中序遍历,后序遍历,如果你不去深刻理解的话就会算错,中序遍历时一定要先遍历最左子树,
在访问根节点,不能直接遍历第一个左子树,要清楚每个遍历首先访问那个结点,要弄清好步骤,按照步骤一步步,才能保证不会出错

posted @ 2020-04-26 19:33  JYangYang  阅读(320)  评论(0编辑  收藏  举报