亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

使用C語言求二叉樹結點的最低公共祖先的方法

2020-01-26 14:59:17
字體:
來源:轉載
供稿:網友

算法分析

我們直接來分析O(n)的算法。

2015810120155494.jpg (344×246)

比如求節點F和節點H的最低公共祖先,先求出從根節點A到F的路徑,再求出A到H的路徑,那么最后一個相同的節點就是最低公共祖先。A->B->D->F和A->B->E->H,最后相同的節點事B,所以最低公共祖先是B節點。求根節點到指定節點的算法先前已經更新過了,復雜度是O(n),所以總的時間復雜度是O(n)。
條件細化:
(1)樹如果是二叉樹,而且是二叉排序樹。
             這中條件下可以使用二叉排序樹的搜索功能找到最低公共祖先。
(2)樹不是二叉排序樹,連二叉樹都不是,就是普通的樹。
      1,如果樹中有指向父節點的指針。
              這問題可以將問題轉化為兩個鏈表相交,求兩個鏈表的第一個交點。
      2,如果樹中沒有指向父節點的指針。
              這問題就有點麻煩了。
      
      
具體來看獲取從根節點到指定節點的函數代碼:

struct BinaryNode{ char value; BinaryNode *left; BinaryNode *right;};

求跟節點到指定節點路徑:

bool GetNodePath(BinaryNode *pRoot,BinaryNode *pNode,vector<BinaryNode*> &v){ if(pRoot==NULL)  return false; v.push_back(pRoot); if(pRoot==pNode)  return true; bool found=GetNodePath(pRoot->left,pNode,v); if(!found)  found=GetNodePath(pRoot->right,pNode,v); if(!found)  v.pop_back();}

求最低公共祖先節點:

BinaryNode* GetCommonParent(BinaryNode *pRoot,BinaryNode *pNode1,BinaryNode *pNode2){ if(pRoot==NULL || pNode1==NULL || pNode2==NULL)  return NULL; vector<BinaryNode*> v1,v2; GetNodePath(pRoot,pNode1,v1); GetNodePath(pRoot,pNode2,v2); BinaryNode *pLast=pRoot; vector<BinaryNode*>::iterator ite1=v1.begin(); vector<BinaryNode*>::iterator ite2=v2.begin(); while(ite1!=v1.end() && ite2!=v2.end()) {  if(*ite1==*ite2)   pLast=*ite1;  ite1++;  ite2++; } return pLast;}

來看一道具體的ACM題目

    題目描述: 
    給定一棵樹,同時給出樹中的兩個結點,求它們的最低公共祖先。

    輸入: 
    輸入可能包含多個測試樣例。 
    對于每個測試案例,輸入的第一行為一個數n(0<n<1000),代表測試樣例的個數。 
    其中每個測試樣例包括兩行,第一行為一個二叉樹的先序遍歷序列,其中左右子樹若為空則用0代替,其中二叉樹的結點個數node_num<10000。 
    第二行為樹中的兩個結點的值m1與m2(0<m1,m2<10000)。 
    輸出: 
    對應每個測試案例, 
    輸出給定的樹中兩個結點的最低公共祖先結點的值,若兩個給定結點無最低公共祖先,則輸出“My God”。 
    樣例輸入: 
    2 
    1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0 
    6 8 
    1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0 
    6 12 
    樣例輸出: 
    2 
    My God 


思路
這道題我考慮的思路是

(1)后序遍歷的思想,用棧保存到查找點的路徑
(2)然后求兩個棧第一個公共節點

AC代碼

  #include <stdio.h>   #include <stdlib.h>       #define N 7000       typedef struct btree {     struct btree *lchild, *rchild;     int data;   } btree;       typedef struct stack {     int top;     btree* data[N];   } stack;       stack *first, *second;   int oneflag, secflag;       /**    * 根據前序序列遞歸構建二叉樹    */   void createBtree(btree **t)   {     int data;     scanf("%d", &data);         if (data == 0) {       *t = NULL;     } else {       *t = (btree *)malloc(sizeof(btree));       (*t)->data = data;       createBtree(&(*t)->lchild);       createBtree(&(*t)->rchild);     }   }       /**    * 后序遍歷二叉樹,構造遍歷棧    */   void postTraverse(btree *t, stack *s, int srcnum, int *flag)   {     if (t != NULL) {       btree *pre;       pre = NULL;           s->data[s->top ++] = t;       while (s->top > 0 || t) {         if (t) {           s->data[s->top ++] = t;           if (t->data == srcnum) {             *flag = 1;             break;           }           t = t->lchild;         } else {           t = s->data[-- s->top];           if (t->rchild == NULL || t->rchild == pre) {             pre = t;             t = NULL;           } else {             s->data[s->top ++] = t;             t = t->rchild;           }         }       }     }   }       /**    * 查找兩個棧第一個公共元素    *    * T = O(n)    *    */   void stackCommonData(stack *f, stack *s)   {     int top, data, flag;         top = (f->top > s->top) ? s->top : f->top;         while (top > 0) {       if (f->data[top - 1]->data == s->data[top - 1]->data) {         data = f->data[top - 1]->data;         flag = 1;         break;       } else {         top --;       }     }         if (flag) {       printf("%d/n", data);     } else {       printf("My God/n");     }   }       /**    * 清理二叉樹    *    */   void cleanBtree(btree *t)   {     if (t) {       cleanBtree(t->lchild);       cleanBtree(t->rchild);       free(t);     }   }           int main(void)   {     int n, sf, se;     btree *t;         scanf("%d", &n);     while (n --) {       createBtree(&t);       scanf("%d %d", &sf, &se);               first = (stack *)malloc(sizeof(stack));       first->top = 0;       oneflag = 0;       postTraverse(t, first, sf, &oneflag);           second = (stack *)malloc(sizeof(stack));       second->top = 0;       secflag = 0;       postTraverse(t, second, se, &secflag);           if (oneflag == 0 || secflag == 0 || first->top == 0 || second->top == 0) {         printf("My God/n");         cleanBtree(t);         continue;       } else {         stackCommonData(first, second);         cleanBtree(t);       }     }     return 0;   } 

    /**************************************************************
        Problem: 1509
        User: wangzhengyi
        Language: C
        Result: Accepted
        Time:150 ms
        Memory:110212 kb
    ****************************************************************/ 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一区第一页| 久久久精品国产| 中文字幕亚洲自拍| 成人激情视频在线观看| 第一福利永久视频精品| 国产高清视频一区三区| 亚洲综合精品一区二区| 色婷婷av一区二区三区久久| 欧美日韩免费在线观看| 国产精品午夜国产小视频| 亚洲石原莉奈一区二区在线观看| 九九精品视频在线| 国产精品久久久久久av福利软件| 2020国产精品视频| 日韩av大片免费看| 黑人巨大精品欧美一区二区免费| 日本一区二区在线播放| 欧美黑人性猛交| 国产一区二区三区高清在线观看| 日韩二区三区在线| 91黑丝高跟在线| 国内精品久久久| 97在线视频免费| 国产精品一区电影| 久久亚洲精品小早川怜子66| 91精品国产91| 日韩中文在线中文网在线观看| 欧美—级a级欧美特级ar全黄| 亚洲视频在线看| 久热在线中文字幕色999舞| 国产精品久久久久久久午夜| 欧美一级片一区| 日韩在线观看电影| 亚洲精品欧美日韩专区| 亚洲天堂免费在线| 国产精品午夜一区二区欲梦| 久久综合国产精品台湾中文娱乐网| 中文字幕精品一区二区精品| 日韩欧美国产免费播放| 国产精品激情av电影在线观看| 亚洲欧美中文日韩在线v日本| 欧美激情综合亚洲一二区| 国产精品一区二区久久久久| 亚洲精品国产电影| 久久精品成人欧美大片古装| 国产色婷婷国产综合在线理论片a| 欧美日韩国产精品一区二区不卡中文| 日韩中文字幕视频| 亚洲永久免费观看| 国内精品久久久久| 国产精品白嫩美女在线观看| 国内精品伊人久久| 亚洲护士老师的毛茸茸最新章节| 中文字幕精品一区久久久久| 国产成人在线一区| 久久久国产精彩视频美女艺术照福利| 国产主播在线一区| 在线亚洲国产精品网| 69精品小视频| 国产精品视频专区| 日本一区二区不卡| 国产精品亚洲美女av网站| 国产精品日日做人人爱| 亚洲四色影视在线观看| 91极品视频在线| 久久精品电影网站| 欧美日韩国产91| 综合国产在线视频| 92国产精品久久久久首页| 亚洲女人天堂色在线7777| 欧美成人午夜激情视频| 日韩精品免费电影| 国内外成人免费激情在线视频| 亚洲女人天堂色在线7777| 日韩激情片免费| 精品一区二区三区电影| 精品国产福利在线| 国产一区二区三区在线播放免费观看| 97香蕉超级碰碰久久免费的优势| 国产精品成人v| 亚洲女性裸体视频| 国产欧美在线观看| 在线一区二区日韩| 国产原创欧美精品| 日韩欧美精品在线观看| 欧美日韩在线视频一区| 中文字幕欧美日韩在线| 亚洲韩国欧洲国产日产av| 国产精品男人爽免费视频1| 久久不射热爱视频精品| 亚洲日本成人女熟在线观看| 国产精品久久久| 久久久久一本一区二区青青蜜月| 隔壁老王国产在线精品| 国产玖玖精品视频| 国产精品高潮粉嫩av| 日韩精品999| 日韩欧美精品中文字幕| 久久99国产精品久久久久久久久| 亚洲免费电影在线观看| 久久久亚洲国产| 中文字幕亚洲自拍| 国产精品一区二区三区久久| 九九视频这里只有精品| 亚洲缚视频在线观看| 日本精品视频在线播放| 92版电视剧仙鹤神针在线观看| 亚洲国产精品高清久久久| 中文字幕精品久久久久| 国产成人精品亚洲精品| 久色乳综合思思在线视频| 97久久精品视频| 久久免费精品日本久久中文字幕| 久久理论片午夜琪琪电影网| 亚洲毛片一区二区| 亚洲午夜久久久久久久| 国产成人精品日本亚洲专区61| 国产精品私拍pans大尺度在线| 色偷偷综合社区| 欧美午夜性色大片在线观看| 精品免费在线观看| 97久久伊人激情网| 亚洲香蕉伊综合在人在线视看| 国内精品美女av在线播放| 国产亚洲在线播放| 国产午夜精品麻豆| 欧美在线欧美在线| 亚洲精品美女久久久| 国产精品久久久久久久av大片| 97视频国产在线| 亚洲成人网久久久| 国模gogo一区二区大胆私拍| 欧美在线观看www| 亚洲嫩模很污视频| 久久久999国产精品| 亚洲国产精品99| 亚洲人在线观看| 久久亚洲精品一区二区| 中文欧美日本在线资源| 精品视频—区二区三区免费| 久99九色视频在线观看| 国产综合福利在线| 欧美日韩一区二区在线| 亚洲精品日韩激情在线电影| 久久国产精品首页| 亚洲欧美中文在线视频| 欧美理论在线观看| 91社影院在线观看| 国产精品人成电影在线观看| 亚洲аv电影天堂网| 成人h视频在线观看播放| 亚洲国产精品嫩草影院久久| 成人免费网视频| 亚洲精品免费在线视频| 日韩电影中文字幕| 亚洲天堂第二页| 久久精品国产69国产精品亚洲| 色老头一区二区三区| 一区二区福利视频| 国产日韩在线精品av| 亚洲第一视频在线观看| 国产激情久久久久| 国产91精品久久久久久久| 欧美色欧美亚洲高清在线视频|