,那麼爸爸(媽媽)
就是樹的根,倆孩子就是這棵樹的葉子,而此時這種,孩子只有唯一父輩(爸爸媽媽看作乙個整體),父輩或者沒有孩子,或者有且最多有兩個孩子的樹就叫做二叉樹,可以參考下圖
就這樣這個家族子子輩輩形成乙個越來越高的二叉樹。( 注意看它是倒過來的)
那麼這個時候故事來了:有一家的的家譜非常奇特,它從第一頁開始,翻閱者每次只能看到家譜的一頁,這一頁上記錄著乙個人的資訊和他兩個孩子在哪一頁的指示頁碼,通過指示頁碼可以找到這兩個孩子的資訊存放頁。不知道你有沒有想象出來這個家譜的樣子。大概是下面這個樣子:
後面還有很多很多這樣的書頁。。。
然後有乙個不知道是第幾十輩孫子突發奇想,他想看看這本家譜上到底有多少先人,自己又是怎麼來的。但是你知道在只有乙個始祖頁面的情況下,
乙個不漏的找出所有人,會有多少種路徑夠你找,還不一定能找全。。。。看似很難的樣子,該怎麼辦?
然而,很巧的是這個孩子很勤奮,他學習過一種叫做二叉樹的資料結構,還研究過它的遍歷演算法,直白點,就是把每乙個點都訪問一次。在這個21世紀網際網路快速發展,計算機極度普及
的年代,他只寫了一段**就搞定了,同時還用了三種方法,這個孩子很厲害啊,後生可畏!!!
故事結束
好了現在來看看二叉樹的
三種
遍歷演算法(挺簡單的,直接上**) :
因為根節點的左右子節點下面又是一棵二叉樹,所以遍歷就只考慮根、左、右三個節點的訪問,訪問就是看他在不在,即 if(p !=null),在,就輸出他的資訊,接著對左右子樹使用相同的方法遍歷即可。遍歷沒有返回值。(詳見**)
1.先序遍歷
保證每個節點訪問一次
2.中序遍歷
3.後序遍歷
有麼有很簡單,5行搞定,相信你已經理解了。
那麼還有乙個問題,我用這段遍歷**去遍歷誰?遍歷二叉樹啊!那麼二叉樹從何而來,這就涉及到二叉樹的節點定義,和二叉樹的建立了。好,一起來看一下:
4.定義二叉樹的節點
首先二叉樹每個節點得有乙個儲存資訊的變數,其次它得有左右子樹的指標指向,那麼就是下面這樣了
5.二叉樹的建立:
如果你理解了上面的先序遍歷演算法,那麼建立也就很簡單了,我們先輸入乙個字元,如果是空節點標誌符,就相當於上乙個插入的是根節點或是葉子節點了,這個節點就是空了,否則,插入這個資訊,遞迴建立左右子樹。看一下**:
上面的**是我從控制台輸入資料,測試的時候用的,如果你是檔案輸入或者其他方式,相應做修改就行。
二叉樹三種遍歷方式非遞迴實現
1.中序遍歷 應為輸出的子樹根的關鍵字位於其左子樹關鍵字值和右子樹的關鍵字值之間 同理,先序後序遍歷。1.先序遍歷非遞迴演算法 define maxsize 100 typedef struct sqstack void preorderunrec bitree t endwhile if stac...
二叉樹的三種非遞迴遍歷
一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。1.遞迴實現 void preorder1 bintree root 遞迴前序遍歷 2.非遞迴實現 根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後...
二叉樹的三種非遞迴遍歷
遞迴演算法和非遞迴演算法的轉換 可以借助棧,將二叉樹的遞迴演算法轉換為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法。先掃瞄 並非訪問 根結點的所有左結點並將他們一一進棧。然後出戰乙個結點 p 顯然結點 p沒有左孩子結點或者左孩子結點均已訪問過 則訪問它。然後掃瞄該結點的有孩子結點,將其...