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樹
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:表的長度)
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。
在一行中輸出Preorder:
以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多餘空格。
問題:明白思路,能畫出樹,但在代碼層面上的實現沒有方向