四旦部、樹

引子:二分查找

int BinarySearch(List tbl,ElementType k)
{
    int left,right,mid,NoFound = -1;
    left = 0;
    right = tbl->length - 1;
    while (left <= right) {
        mid = (left + right)/2;
        if(k < tbl->data[mid])
            right = mid - 1;
        else if (k > tbl->data[mid])
            left = mid + 1;
        else
            return mid;
    }
    return NoFound;
    
}

樹(Tree): n(n>0)個(gè)節(jié)點(diǎn)構(gòu)成的集合呀枢。
當(dāng)n=0時(shí)胚股,為空樹。
對(duì)于一棵非空樹(n>0)裙秋,它具有一下性質(zhì):

  • 樹中有一個(gè)稱為“根(Root)”的特殊結(jié)點(diǎn)琅拌,用r表示;
  • 其余結(jié)點(diǎn)可分為m(m>0)個(gè)互不相交的有限集T1,T2,..摘刑,Tm财忽,其中每個(gè)集合本身又是一棵樹,稱為原來樹的“子樹(SubTree)'
  • n個(gè)節(jié)點(diǎn)的樹有n-1個(gè)邊

樹的一些基本術(shù)語:

  1. 結(jié)點(diǎn)的度(Degree):結(jié)點(diǎn)的子樹個(gè)數(shù)
  2. 樹的度:樹的所有結(jié)點(diǎn)中最大的度數(shù)
  3. 葉結(jié)點(diǎn) (Leaf):度為0的結(jié)點(diǎn)
  4. 父結(jié)點(diǎn) (Parent):有子樹的結(jié)點(diǎn)是其子樹
    的根結(jié)點(diǎn)的父結(jié)點(diǎn)
  5. 子結(jié)點(diǎn) (Child):若A結(jié)點(diǎn)是B結(jié)點(diǎn)的父結(jié)
    點(diǎn)泣侮,則稱B結(jié)點(diǎn)是A結(jié)點(diǎn)的子結(jié)點(diǎn);子結(jié)點(diǎn)也稱孩子結(jié)點(diǎn)即彪。
  6. 兄弟結(jié)點(diǎn)(Sibling):具有同一父結(jié)點(diǎn)的各
    結(jié)點(diǎn)彼此是兄弟結(jié)點(diǎn)。
  7. 路徑和路徑長度:從結(jié)點(diǎn)n,到n的路徑為一
    個(gè)結(jié)點(diǎn)序列n1,n2 ,… 活尊,n ,n是 n+的父結(jié)點(diǎn)隶校。路徑所包含邊的個(gè)數(shù)為路徑的長度。
  8. 祖先結(jié)點(diǎn)(Ancestor):沿樹根到某一結(jié)點(diǎn)路
    徑上的所有結(jié)點(diǎn)都是這個(gè)結(jié)點(diǎn)的祖先結(jié)點(diǎn)蛹锰。
  9. 子孫結(jié)點(diǎn)(Descendant):某一結(jié)點(diǎn)的子樹
    中的所有結(jié)點(diǎn)是這個(gè)結(jié)點(diǎn)的子孫深胳。
  10. 結(jié)點(diǎn)的層次(Level):規(guī)定根結(jié)點(diǎn)在1層,其它任一結(jié)點(diǎn)的層數(shù)是其父結(jié)點(diǎn)的層數(shù)加1铜犬。12.樹的深度(Depth):樹中所有結(jié)點(diǎn)中的最大層次是這棵樹的深度舞终。

二叉樹

二叉樹T: 一個(gè)有窮的結(jié)點(diǎn)集合。
這個(gè)集合可以為空
若不為空癣猾,則它是由根結(jié)點(diǎn)和稱為其左子樹T和右子樹T的兩個(gè)不相交的二叉樹組成敛劝。

1. 特殊的二叉樹

  • 斜二叉樹


    斜二叉樹
  • 滿二叉樹:一棵深度為k且有2n-1個(gè)節(jié)點(diǎn)的二叉樹

    滿二叉樹

  • 完全二叉樹:一棵深度為k有n個(gè)節(jié)點(diǎn)的二叉樹,當(dāng)且僅當(dāng)每個(gè)節(jié)點(diǎn)的編號(hào)與深度為k的滿二叉樹中的編號(hào)一一對(duì)應(yīng)的二叉樹


    完全二叉樹

2. 二叉樹的幾個(gè)性質(zhì)

  • 一個(gè)二叉樹第i層最多有2i-1個(gè)結(jié)點(diǎn)(i>=1)
  • 深度為k的二叉樹最大結(jié)點(diǎn)數(shù)為2k -1 (k>=1)
  • 對(duì)于任何非空二叉樹T, n0表示葉子結(jié)點(diǎn)個(gè)數(shù)纷宇,n2表示度為2的非葉子結(jié)點(diǎn)個(gè)數(shù)夸盟,那么滿足n0 = n2 + 1;

3. 二叉樹的存儲(chǔ)結(jié)構(gòu)

1. 順序存儲(chǔ)結(jié)構(gòu)

但是對(duì)于一般二叉樹來說如果補(bǔ)全空缺位,改成完全二叉樹之后在存儲(chǔ)會(huì)造成空間浪費(fèi)像捶。


2. 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

4. 二叉樹的遍歷

1. 先序遍歷

? 1. 訪問根結(jié)點(diǎn)
? 2. 先序訪問左子樹
? 3. 先序訪問右子樹

1. 遞歸遍歷
void PreOrserTraversal(BinTree BT)
{
    if(BT){
        printf("%d",BT->data);
        PreOrserTraversal(BT->left);
        PreOrserTraversal(BT->right);
    }
}
2. 非遞歸遍歷
void PreOrderTraversal(BinTree BT)
{
    BinTree T = BT;
    Stack s = CreateStack(MAXSIZE);
    while (T || !IsEmpty(s)) {
        if(T){
            Push(T);
            printf("%d",T->data);
            T = T->left;
        }else{
            T = Pop(s);
            T -> right;
        }
    }
}
2. 中序遍歷

? 1. 中序訪問左子樹
? 2. 訪問根結(jié)點(diǎn)
? 3. 中序訪問右子樹

1. 遞歸遍歷
void InOrderTraversal(BinTree BT)
{
    if(BT){
        InOrderTraversal(BT->left);
        printf("%d",BT->data);
        InOrderTraversal(BT->right);
    }
}
2. 非遞歸遍歷
void InOrderTraversal(BinTree BT)
{
    BinTree T = BT;
    Stack s = CreateStack(MAXSIZE);
    while (T || !IsEmpty(s)) {
        if(T){
            Push(T);
            T = T->left;
        }else{
            T = Pop(s);
            printf("%d",T->data);
            T = T->right;
        }
    }
}
3. 后序遍歷

? 1. 后序訪問左子樹
? 2. 后序訪問右子樹
? 3. 訪問根結(jié)點(diǎn)

1. 遞歸遍歷
void PostOrderTraversal(BinTree BT)
{
    if(BT){
        PostOrderTraversal(BT->left);
        PostOrderTraversal(BT->right);
        printf("%d",BT->data);
    }
}

2. 非遞歸遍歷
void PostOrderTraversal(BinTree BT)
{
    BinTree T = BT;
    Stack s = CreateStack(MAXSIZE);
    while (T || !IsEmpty(s)) {
        if(T){
            Push(T);
            T = T->left;
        }else{
            T = Pop(s);
            if(T->right == NULL || T->flag == 1){
                printf("%d",T->data);
                T = NULL;
            }else{
                Push(T);//重新入棧
                T->flag == 1; // flag表示已經(jīng)訪問過右子樹了
                T = T->right;
            }
        }
    }
}
4. 層序遍歷

? 1. 先將根結(jié)點(diǎn)入隊(duì)列
? 2. 從隊(duì)列中取出結(jié)點(diǎn)并訪問
? 3. 然后將該結(jié)點(diǎn)的所有非空子結(jié)點(diǎn)入隊(duì)列

void LevelOrderTraversal(Bin?Tree BT)
{
    Queue Q;
    BinTree T;
    if(!BT) return;
    Q = CreateQueue(MAXSIZE);
    EnQueue(Q, BT);
    while (!IsEmpty(Q)) {
        T = DeQueue(Q);
        printf("%d",T->data);
        if(T->left) EnQueue(Q,T->left);
        if(T->right) EnQueue(Q, T->right);
    }
}

5. 遍歷應(yīng)用例子

1. 遍歷二叉樹中的葉子結(jié)點(diǎn)
void PreOrserTraversal(BinTree BT)
{
    if(BT){
       if(!BT->left && !BT->right)
        printf("%d",BT->data);

        PreOrserTraversal(BT->left);
        PreOrserTraversal(BT->right);
    }
}
  • 這個(gè)例子也可以用中序和后序
2. 求二叉樹的高度
int PostOrderGetHeight(BinTree BT)
{
    int Max, HL, HR;
    if(BT){
        HL = PostOrderGetHeight(BT->left);
        HR = PostOrderGetHeight(BT->right);
        Max = HL > HR ? HL : HR;
        return Max + 1;
    }
    return 0;
}

6. 二叉樹同構(gòu)問題

給定兩棵樹T1和T2上陕。如果T1可以通過若干次左右孩子互換就變成T2桩砰,則我們稱兩棵樹是“同構(gòu)”的。現(xiàn)給定兩棵樹释簿,請(qǐng)你判斷它們是否是同構(gòu)的亚隅。


1. 二叉樹靜態(tài)鏈表表示
2. 建二叉樹
Tree BuildTree(struct TreeNode T[])
{
    int N, Root = Null;
    char cl,cr;
    scanf("請(qǐng)輸入結(jié)點(diǎn)個(gè)數(shù):%d\n",&N);
    int *check = (int *)malloc(N*sizeof(int));
    if(N){
        for (int i = 0; i<N; i++) check[i] = 0;
        for (int i = 0; i<N; i++) {
            scanf("%c,%c,%c\n",&T[i].Element,&cl,&cr);
            if(cl != '-'){
                T[i].left = cl - '0';
                check[T[i].left] = 1;
            }else{
                T[i].left = Null;
            }
            
            if(cr != '-'){
                T[i].right = cr - '0';
                check[T[i].right] = 1;
            }else{
                T[i].right = Null;
            }
        }
        
        for (int i = 0; i<N; i++) {
            if(!check[i]) break;
        }
        Root = i;
    }
    return Root; //返回根結(jié)點(diǎn)索引
}
3. 判定同構(gòu)
int Isomorphic(Tree R1,Tree R2)
{
    if(R1==Null && R2==Null)
        return 1;
    if((R1==Null && R2!=Null) || (R1!=Null && R2==Null))
        return 0;
    if(T1[R1].Element != T2[R2].Element)
        return 0;
    if(T1[R1].left == Null && T2[R2].left == Null)
        return Isomorphic(T1[R1].right,T2[R2].right);
    if((T1[R1].left != Null && T2[R2].left != Null)&&
       (T1[T1[R1].left].Element == T2[T2[R2].left].Element))
        return Isomorphic(T1[R1].left,T2[R2].left)&&Isomorphic(T1[R1].right,T2[R2].right);
    else
        return Isomorphic(T1[R1].left,T2[R2].right)&&Isomorphic(T1[R1].right,T2[R2].left);
    
}

二叉搜索樹

二叉搜索樹: 一棵二叉樹,可以為空;如果不為空庶溶,滿足以下性質(zhì):

  1. 非空左子樹的所有鍵值小于其根結(jié)點(diǎn)的鍵值煮纵。
  2. 非空右子樹的所有鍵值大于其根結(jié)點(diǎn)的鍵值。
  3. 左渐尿、右子樹都是二叉搜索樹。
二叉搜索樹操作的特別函數(shù):
  • Position Find( ElementType X, BinTree BST):從二叉搜索樹BST中查找元素X矾瑰,返回其所在結(jié)點(diǎn)的地址;
  • Position FindMin( BinTree BST):從二叉搜索樹BST中查找并返回最小元素所在結(jié)點(diǎn)的地址;
  • Position FindMax( BinTree BST):從二叉搜索樹BST中查找并返回最大元素所在結(jié)點(diǎn)的地址砖茸。
  • BinTree Insert(ElementType X, BinTree BST )
  • BinTree Delete(ElementType X, BinTree BST )
1. 遞歸查找法
Position Find( ElementType X, BinTree BST)
{
    if(!BST) return NULL;
    if(X > BST->Data)
        return Find(X, BST->Right);
    else if(X < BST->Data)
        return Find(X, BST->Left);
    else
        return BST;
}
2. 非遞歸查找法
Position IterFind(ElementType X, BinTree BST)
{
    while (BST) {
        if(X > BST->Data)
            BST = BST->Right;
        else if (X < BST->Data)
            BST = BST->Left;
        else
            return BST;
    }
    return NULL;
}
3. 查找最小元素 遞歸法
Position FindMin( BinTree BST)
{
    if(!BST)
        return NULL;
    else if (!BST->Left)
        return BST;
    else
        return FindMin(BST->Left);
}
4. 查找最大元素 非遞歸法
Position FindMax( BinTree BST)
{
    if(BST)
        while (BST->Right) {
            BST = BST->Right
        }
    
    return BST;
}
5. 遞歸插入
BinTree Insert(ElementType X, BinTree BST )
{
    if(!BST){
        BST = malloc(sizeof(struct TreeNode));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }else if(X < BST->Data)
            BST->Left = Insert(X, BST->Left);
    else if (X > BST->Data)
        BST->Right = Insert(X, BST->Right)
        
    return BST;
}
二叉搜索樹的刪除

考慮三種情況:

  1. 要?jiǎng)h除的結(jié)點(diǎn)是葉子結(jié)點(diǎn):直接刪除,并將父結(jié)點(diǎn)指針置為NULL
  2. 要?jiǎng)h除的結(jié)點(diǎn)有一個(gè)孩子結(jié)點(diǎn):刪除該結(jié)點(diǎn)殴穴,并將父結(jié)點(diǎn)的指針指向這個(gè)孩子結(jié)點(diǎn)
  3. 要?jiǎng)h除的結(jié)點(diǎn)有左右子樹:用另一個(gè)結(jié)點(diǎn)替代被刪除的結(jié)點(diǎn):左子樹最大元素或右子樹的最小元素
BinTree Delete(ElementType X, BinTree BST )
{
    BinTree Tmp;
    if(!BST)
        printf("要?jiǎng)h除的元素未找到");
    else if(X < BST->Data)
        BST->Left = Delete(X,  BST->Left);
    else if (X > BST->Data)
        BST->Right = Delete(X, BST->Right);
    else if (BST->Left && BST->Right){
        Tmp = FindMin(BST->Right);
        BST->Data = Tmp->Data;
        BST->Right = Delete(Tmp->Data, BST->Right);
    }else{
        Tmp = BST;
        if(!BST->Left)
            BST = BST->Right;
        else if (!BST->Right)
            BST = BST->Left;
        free(Tmp);
    }
    
    return BST;
    
}

平衡二叉樹

  • 可以看出(b)的查找效率最高凉夯,越平衡的樹查找效率越高。
    平衡因子(Balance Factor 簡(jiǎn)稱:BF): BF = hL - hR , hL hR 分別為左右子樹高度采幌。
    平衡二叉樹(AVL樹): 空樹劲够,或者任意左右子樹的高度差絕對(duì)值不超過1,即|BF(T)|<=1休傍。

平衡二叉樹的調(diào)整

LL旋轉(zhuǎn)
LR旋轉(zhuǎn)
RR旋轉(zhuǎn)
RL旋轉(zhuǎn)
1. 判斷二叉樹是否平衡
bool noBalance = false;
struct TreeNode *rjt = NULL;

int checkTreeBalance(struct TreeNode *root)
{
    if(NULL == root) return 0;
    int l = checkTreeBalance(root->left);
    int r = checkTreeBalance(root->right);
    if(noBalance) return 0;
    
    int dif = abs(l - r);
    if(dif > 1){
        noBalance = true;
        rjt = root;
    }
    return l > r ? l + 1 : r + 1;
}
2. 父結(jié)點(diǎn)查詢
TreeNode* queryTopData(TreeNode *root, int data)
{
    TreeNode *top = NULL;
    TreeNode *tmp = root;
    
    while (tmp != NULL) {
        if(data == tmp->data){
            return top;
        }
        
        top = tmp;
        
        if(data > tmp->data)
            tmp = tmp->right;
        else if(data < tmp->data)
            tmp = tmp->left;
    }
    return NULL;
}
3. 左左旋轉(zhuǎn)
//不平衡二叉樹
           70
           / \
          50  80
         /  \
        40  60
        /
       30
// 左左旋轉(zhuǎn)后的二叉樹
         50
         / \
        40 70
        /  / \
       30 60 80
bool rotateLL(TreeNode **root, TreeNode *notBalanceRoot)
{
    if(*root != notBalanceRoot){
        printf("左左旋轉(zhuǎn)征绎,非根結(jié)點(diǎn)");
         //查找不平衡結(jié)點(diǎn)的父結(jié)點(diǎn)
        TreeNode *fNode = queryTopData(*root,notBalanceRoot->data);
        if(fNode == NULL) return false;

        TreeNode *left = notBalanceRoot->left;
        TreeNode *lright = left->right;

        left->right = notBalanceRoot;
        notBalanceRoot->left = lright;
        
        if(notBalanceRoot == fNode->left)
            fNode->left = left;
        else if (notBalanceRoot == fNode->right)
            fNode->right = left;
        
        return true;
    }else{
        printf("左左旋轉(zhuǎn),根結(jié)點(diǎn)");
        
        TreeNode *left = notBalanceRoot->left;
        TreeNode *lright = left->right;
        
        left->right = notBalanceRoot;
        *root->left = lright;
        
        *root = left;
        return true;
    }
}

4. 左右旋轉(zhuǎn)
//不平衡二叉樹
        70
       /  \
      50   80
     /  \
    40  60
        /
       55
//左右旋轉(zhuǎn)后的二叉樹
        60
        / \
       50  70
      /  \  \
     40  55  80
bool rotateLR(TreeNode **root, TreeNode *notBalanceRoot)
{
    if(*root != notBalanceRoot){
        printf("左右旋轉(zhuǎn)磨取,非根結(jié)點(diǎn)");
        
        TreeNode *fNode = queryTopData(*root,notBalanceRoot->data);
        if(fNode == NULL) return false;
        
        TreeNode *left = notBalanceRoot->left;
        TreeNode *lright = left->right;
        TreeNode *lrightLeft = lright->left;
        TreeNode *lrightRight = lright->right;
        
        lright->left = left;
        lright->right = notBalanceRoot;
        left->right = lrightLeft;
        notBalanceRoot->left = lrightRight;
        
        if(notBalanceRoot == fNode->left)
            fNode->left = lright;
        else if (notBalanceRoot == fNode->right)
            fNode->right = lright;
        
        return true;
    }else{
        printf("左右旋轉(zhuǎn)人柿,根結(jié)點(diǎn)");
        TreeNode *left = notBalanceRoot->left;
        TreeNode *lright = left->right;
        TreeNode *lrightLeft = lright->left;
        TreeNode *lrightRight = lright->right;
        
        lright->left = left;
        lright->right = notBalanceRoot;
        left->right = lrightLeft;
        notBalanceRoot->left = lrightRight;
        
        *root = lright;
        
        return true;
}

5. 右右旋轉(zhuǎn)
//不平衡的二叉樹
         70
        /  \
       50   80
           /  \
          75   88
               /
              85
//右右旋轉(zhuǎn)的二叉樹
         80
        /  \
       70   88
       / \  /
      50 75 85
bool rotateRR(TreeNode **root, TreeNode *notBalanceRoot)
{
    if(*root != notBalanceRoot){
        printf("右右旋轉(zhuǎn),非根結(jié)點(diǎn)");
        
        TreeNode *fNode = queryTopData(*root,notBalanceRoot->data);
        if(fNode == NULL) return false;
        
        TreeNode *right = notBalanceRooot->right;
        TreeNode *rleft = right->left;
        right->left = notBalanceRoot
        notBalanceRoot->right = rleft;
        
        if(notBalanceRoot == fNode->left)
            fNode->left = right;
        else if(notBalanceRoot == fNode->right)
            fNode->right = right;
        
        return true;
    }else{
        printf("右右旋轉(zhuǎn)忙厌,根結(jié)點(diǎn)");
        
        TreeNode *right = notBalanceRooot->right;
        TreeNode *rleft = right->left;
        right->left = notBalanceRoot
        notBalanceRoot->right = rleft;
        
        *root = right;
        
        return true;
    }
}
6. 右左旋轉(zhuǎn)
//不平衡二叉樹
        70
       /  \
      50   80
          /  \
         75   88
           \
           77
//右左旋轉(zhuǎn)后的二叉樹
        75
       /  \
      70   80
     /    /  \
    50   77   88
bool rotateRL(TreeNode **root,TreeNode *notBalanceRoot)
{
    if(*root != notBalanceRoot){
        printf("右左旋轉(zhuǎn)凫岖,非根結(jié)點(diǎn)");
        
        TreeNode *fNode = queryTopData(*root,notBalanceRoot->data);
        if(fNode == NULL) return false;
        
        TreeNode *right = notBalanceRoot->right;
        TreeNode *rleft = right->left;
        TreeNode *rleftLeft = rleft->left;
        TreeNode *rleftRight = rleft->right;
        
        rleft->left = notBalanceRoot;
        rleft->right = right;
        
        notBalanceRoot->right = rleftLeft;
        right->left = rleftRight;
        
        if(notBalanceRoot == fNode->left)
            fNode->left = rleft;
        else if (notBalanceRoot == fNode->right)
            fNode->right = rleft;
        
        return true;
    }else{
        printf("右左旋轉(zhuǎn),根結(jié)點(diǎn)");
        
        TreeNode *right = notBalanceRoot->right;
        TreeNode *rleft = right->left;
        TreeNode *rleftLeft = rleft->left;
        TreeNode *rleftRight = rleft->right;
        
        rleft->left = notBalanceRoot;
        rleft->right = right;
        
        notBalanceRoot->right = rleftLeft;
        right->left = rleftRight;
        
       *root = rleft;
        
        return true;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逢净,一起剝皮案震驚了整個(gè)濱河市哥放,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爹土,老刑警劉巖甥雕,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胀茵,居然都是意外死亡犀农,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宰掉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呵哨,“玉大人赁濒,你說我怎么就攤上這事∶虾Γ” “怎么了拒炎?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挨务。 經(jīng)常有香客問我击你,道長,這世上最難降的妖魔是什么谎柄? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任丁侄,我火速辦了婚禮,結(jié)果婚禮上朝巫,老公的妹妹穿的比我還像新娘鸿摇。我一直安慰自己,他們只是感情好劈猿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布拙吉。 她就那樣靜靜地躺著,像睡著了一般揪荣。 火紅的嫁衣襯著肌膚如雪筷黔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天仗颈,我揣著相機(jī)與錄音佛舱,去河邊找鬼。 笑死挨决,一個(gè)胖子當(dāng)著我的面吹牛名眉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凰棉,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼损拢,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了撒犀?” 一聲冷哼從身側(cè)響起福压,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎或舞,沒想到半個(gè)月后荆姆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡映凳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年胆筒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仆救,死狀恐怖抒和,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彤蔽,我是刑警寧澤摧莽,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站顿痪,受9級(jí)特大地震影響镊辕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚁袭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一征懈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揩悄,春花似錦卖哎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厦章。三九已至镇匀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袜啃,已是汗流浹背汗侵。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留群发,地道東北人晰韵。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像熟妓,于是被迫代替她去往敵國和親雪猪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 總括: 本文講解了數(shù)據(jù)結(jié)構(gòu)中的[樹]的概念起愈,盡可能通俗易懂的解釋樹這種數(shù)據(jù)結(jié)構(gòu)的概念只恨,使用javascrip...
    秦至閱讀 808評(píng)論 0 6
  • 四官觅、樹與二叉樹 1. 二叉樹的順序存儲(chǔ)結(jié)構(gòu) 二叉樹的順序存儲(chǔ)就是用數(shù)組存儲(chǔ)二叉樹。二叉樹的每個(gè)結(jié)點(diǎn)在順序存儲(chǔ)中都有...
    MinoyJet閱讀 1,537評(píng)論 0 7
  • 前面講到的順序表、棧和隊(duì)列都是一對(duì)一的線性結(jié)構(gòu)笛辟,這節(jié)講一對(duì)多的線性結(jié)構(gòu)——樹功氨⌒蛩眨「一對(duì)多」就是指一個(gè)元素只能有一個(gè)前...
    Alent閱讀 2,240評(píng)論 1 28
  • note:先理解思想, 再理解代碼;如下只是最基本和核心的; 樹的定義 Tree是n個(gè)結(jié)點(diǎn)的有限集合, 非空樹遵循...
    陳碼工閱讀 268評(píng)論 1 2
  • 樹的應(yīng)用按考綱來看的話:1.二叉排序樹2.堆結(jié)構(gòu)3.哈夫曼(Huffman)樹和哈夫曼編碼而剛好這節(jié)課剛好都講到了...
    yhcheer閱讀 919評(píng)論 0 0