樹、二叉樹、查找算法總結

1.思惟導圖

2.重要概念的筆記

樹的性質:

1.樹中的節點數等於全部節點的度數加1編程

2.度爲m的樹中第i層最多又m^(i-1)個節點(i>=1)函數

3.高度爲h的m次樹最多又(m^h-1)/(m-1)個節點指針

4.具備n個節點的m次數的最小高度爲logm(n(m-1)+1) 向上取整code

樹轉換爲森林:

左孩子右兄弟blog

二叉樹的性質:

1.非空二叉樹的葉子節點樹等於雙分支節點數加1排序

2.非空二叉樹的第i層上最多有2^(i-1)個節點(i>=1)string

3.高度爲h的二叉樹最多有2^h-1個節點(h>=1)it

4.編號爲i的節點如有左孩子,則左孩子編號爲2i;有右孩子,其右孩子編號爲2i+1;除根節點外節點其雙親編號爲i/2io

5.具備n個節點的徹底二叉樹的高度爲(log2 n) +1;思維導圖

二叉樹的遍歷:

//先序遍歷
Status PreOrderTraverse(BiTree T){
	if (T != NULL){
		cout << T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}

	return OK;
}

	
//中序遍歷
Status InOrderTraverse(BiTree T){
	if (T != NULL){
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}

	return OK;
}
//後序遍歷
Status PostOrderTraverse(BiTree T){
	if (T != NULL){
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout << T->data;
	}

	return OK;
}
//層次遍歷
void levelOrder(BinTree T) {
	queue<BinTree> q;
	q.push(T);
	while (q) {
		cout << q.front().data;
		q.pop();
		if (T->Right) q.push(T->Right);
		if (T->Left) q.push(T->Left);
			T = q.front();
	}
}

二叉樹的建立

Status CreateBiTreeFromString(BiTree &T, string str, int &index){
	char ch;
	if (index <= str.size() - 1)
		ch = str[index++];
	else
		ch = '#';

	if (ch == NULL) ch = '#';
	if (ch == '#' || ch == ' ') T = NULL;
	else{
		if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
		T->data = ch;
		CreateBiTreeFromString(T->lchild, str, index);
		CreateBiTreeFromString(T->rchild, str, index);
	}
	return OK;
}

二叉排序樹的建立:

BinTree Insert(BinTree BST, ElementType X) {
    if (BST == NULL) {
        BST = (BinTree)malloc(sizeof(struct TNode));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }
    else {
        if (X > BST->Data) BST->Right = Insert(BST->Right, X);
        else if (X < BST->Data) BST->Left = Insert(BST->Left, X);
    }
    return BST;
}

二叉排序樹的查找:

Position Find(BinTree BST, ElementType X) {
    while (BST) {
        if (X < BST->Data) {
            BST = BST->Left;
        }
        else if (X > BST->Data) {
            BST = BST->Right;
        }
        else return BST;
    }
    return NULL;
}

二叉排序樹的刪除:

BinTree Delete(BinTree BST, ElementType X) {
    BinTree temp;
    if (BST == NULL)//x不存在
    {
        printf("Not Found\n");
    }
    else {
        if (X == BST->Data) {//找到x
            if (BST->Right && BST->Left) {//有左右孩子
                temp = FindMax(BST->Left);
                BST->Data = temp->Data;
                BST->Left = Delete(BST->Left,temp->Data);
            }
            else {
                temp = BST;
                if (!BST->Left) BST = BST->Right;//有右孩子或葉子節點
                else if (!BST->Right) BST = BST->Left;//有左孩子
                free(temp);
            }
        }
        else if (X > BST->Data) BST->Right = Delete(BST->Right, X);
        else BST->Left = Delete(BST->Left, X);

    }
    return BST;
}
Position FindMax(BinTree BST) {//找左子樹最右節點
    BinTree p;
    p = (BinTree)malloc(sizeof(struct TNode));
    p = NULL;
    while (BST) {
        p = BST;
        BST = BST->Right;
    }
    return p;
}

B樹與B+樹

B樹
1.m階B樹的非根節點的孩子個數最多有m個,最少有m/2(向上取整)個
2.關鍵字個數最多有m-1個,最少有m/2-1個
B-樹的插入:

在查找不成功以後,需進行插入。關鍵字****插入的位

置一定在葉子結點層,有下列幾種狀況:

插入後,該結點的關鍵字個數n<m-1,不修改指針;

插入後,該結點的關鍵字個數 n=m-1,則需進行結點分裂
分裂過程:
1.若是沒有雙親結點,新建一個雙親結點,樹的高度增長一層。

2.若是有雙親結點,將k(i下標)插入到雙親結點中。
B-樹的刪除:和插入的考慮相反,

首先必須找到待刪關鍵字所在結點,而且要求刪除

以後,結點中關鍵字的個數不能小於m/2-1;不然,

要從其左(或右)兄弟結點「借調」關鍵字,若其左

和右兄弟結點均無關鍵字可借(結點中只有最少許

的關鍵字),則必須進行結點的「合併」。
B+樹
1.m階B+樹的每一個分支節點至多有m棵子樹
2.有n棵子樹的節點有n個關鍵字
3.葉子節點包含所有關鍵字及指向相應記錄的指針
4.能夠順序查找,不一樣於b+樹。

哈希查找

處理衝突的方法:開放定址,鏈地址法

鏈地址法:將全部哈希地址相同的記錄都連接在同一鏈表中

決定哈希表查找的ASL的因素: 選用的哈希函數 選用的處理衝突的方法 哈希表飽和的程度,裝載因子(a=n/m)值的大小(n:記錄數,m:表的長度)

3.疑難問題及解決方案(若是有的話,不求多但求精。可包含編程題,可只包含無解決方案的疑難問題)

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。

輸入格式:

第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。

輸出格式:

在一行中輸出Preorder:以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多餘空格。

問題:明白思路,能畫出樹,但在代碼層面上的實現沒有方向

相關文章
相關標籤/搜索