二叉樹的遞迴遍歷和非遞迴遍歷
在此分別總結先序,中序,後序的結點輸出順序。
先序: 1.訪問根結點
2.訪問左子樹
3.訪問右子樹
先序較簡單,不予以即係解釋。
中序:1.訪問左子樹
2.訪問根結點
3.訪問右子樹
原則:訪問左子樹。【先訪問左子樹中的左子樹,再訪問左子樹中的右子樹。】直到訪問到葉子結點後輸出。
輸出根。
訪問右子樹。【先訪問右子樹中的左子樹,再訪問右子樹中的右子樹。】直到訪問到葉子結點後輸出。
具體步驟如下:
a作為根。從a開始,先訪問a的左子樹。即
在看b的左子樹,d。則輸出d。b無左子樹。訪問完b的左子樹。然後訪問b。輸出b。再看b的右子樹。f有左子樹e,則輸出e。返回輸出f。a的左子樹全部輸出完,再返回a,輸出a。
同理,看a的右子樹。
所以,中序遍歷輸出的結果為:(d b e f)a(g h c i).
後序:1.訪問左子樹
2.訪問右子樹
3.訪問根
原則:訪問左子樹。【先訪問左子樹中的左子樹,再訪問左子樹中的右子樹】。直到訪問到葉子結點後輸出。
訪問右子樹。【先訪問右子樹中的左子樹,再訪問右子樹中的右子樹】。直到訪問到葉子結點後輸出。
再返回訪問根,並輸出。
具體步驟:
先訪問a的左子樹。再訪問左子樹中的左子樹。【即:a的左子樹為b,再訪問b的左子樹d。d沒有左右子樹,輸出d。】,然後訪問左子樹中的右子樹。【即:訪問b的右子樹f,f還有左子樹,再訪問f的左子樹e,e沒有左右子樹。輸出e。再輸出f,再輸出b。】。
然後訪問a的右子樹。再訪問右子樹中的左子樹。【即:a的右子樹為c,再訪問c的左子樹g。g還有右子樹h,輸出h。再輸出g,再輸出g】,然後訪問右子樹中的右子樹。【即:訪問c的右子樹i,i沒有左右子樹,輸出i。在輸出c。再輸出a。】。
所以,後序遍歷輸出結果為:(d e f b)(h g i c)a
**如下:
#include#includeusing namespace std;
// 定義樹結構體
typedef struct _bitree
binode,*bitree;
// 遞迴先序遍歷二叉樹
void preorder(bitree root)
}// 遞迴中序遍歷二叉樹
void inorder(bitree root)
}// 遞迴後序遍歷二叉樹
void postorder(bitree root)
}// 建立二叉樹
void createbitree(bitree *root)
else
(*root)->data = ch;
createbitree(&((*root)->lchild));
createbitree(&((*root)->rchlid)); }}
// 後序遍歷求二叉樹高度的遞迴演算法
int posttreedepth(bitree root)
else }
// 非遞迴先序遍歷二叉樹
void preorder1(bitree root)
else
}}// 非遞迴中序遍歷二叉樹
void inorder1(bitree root)
else
}}// 非遞迴後序遍歷二叉樹
void postorder1(bitree root)
if (!s.empty())
else
} }}
int main(void)
結果如下:
二叉樹建立以及遍歷
題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結果。輸入描述 輸入包括1行字串,長度不超過100。輸出描述 可能...
C 二叉樹的建立以及遍歷
在筆試面試的過程中,二叉樹也是難點之一,考的也是比較多的。我也是被這個問題給難倒過,不能在乙個地方摔兩次啊!雖然這個東西第一次寫出來了,可是如果長時間不看不寫不用,還是很容易忘記的。溫故而知新,老子還是很厲害的啊,要謹記老子的話了。廢話不多說,直接上 吧!還是一樣在vc6.0上除錯過的。includ...
二叉樹的建立以及遍歷C C
一 二叉樹的定義 二叉樹 binary tree 是個有限元素的集合,該集合或者為空,或者由乙個稱為根 root 的元素及兩個不相交的 分別被稱為左子樹和右子樹的二叉樹組成。當集合為空時,稱該二叉樹為空二叉樹,在二叉樹中,乙個元素也成為乙個節點。二 二叉樹的資料結構 下面為二叉樹鏈式儲存結構的定義 ...