求二叉樹中從根結點到葉子結點的路徑

2021-09-10 06:21:37 字數 3350 閱讀 4496

/**

*    實驗題目:

*        求二叉樹中從根結點到葉子結點的路徑

*    實驗目的:

*        掌握二叉樹遍歷演算法的應用,熟練使用先序、中序、後序3種遞迴

*    和非遞迴遍歷演算法以及層次遍歷演算法進行二叉樹問題求解。

*    實驗內容:

設計程式,完成如下功能:

*    1、採用先序遍歷方法輸出所有從葉子結點到根結點的逆路徑

*    2、採用先序遍歷方法輸出第一條最長的逆路徑

*    3、採用後序非遞迴遍歷方法輸出所有從葉子結點到根結點的逆路徑

*    4、採用層次遍歷方法輸出所有從葉子結點到根結點的逆路徑

*/#include

#include

#include

#define max_size 100

typedef char elemtype;

typedef struct node

btnode; // 宣告二叉鏈結點型別

/*-------------由括號表示串str建立二叉鏈b-----------------*/

static void create_btree(btnode *&b, char *str) // 建立二叉樹(形參b:指標的引用)

}break;

}// 取下乙個字元

j++;

ch = str[j];}}

/*--------------------------以括號表示法輸出二叉樹b----------------------*/

// "a(b(d,e(h(j,k(l,m(,n))))),c(f,g(,i)))"

static void disp_btree(btnode *b)}}

/*--------------------------釋放二叉樹b的所有結點----------------------*/

static void destroy_btree(btnode *&b) // 銷毀二叉樹(形參b:指標的引用)

}/*--------------------------返回b結點的左孩子結點指標----------------------*/

static btnode *left_child_node(btnode *b)

/*--------------------------返回b結點的右孩子結點指標----------------------*/

static btnode *right_child_node(btnode *b)

/*--------------------------返回data域為x的結點指標----------------------*/

static btnode *find_node(btnode *b, elemtype x) // 查詢值為x的結點

}/*--------------------------求二叉樹b的深度----------------------*/

static int btree_height(btnode *b)

}/*--------------------------採用先序遍歷方法輸出所有從葉子結點到根結點的逆路徑----------------------*/

static void all_path1(btnode *b, elemtype path, int path_len)

else

}/*--------------------------採用先序遍歷方法輸出第一條最長的逆路徑----------------------*/

static void long_path1(btnode *b, elemtype path, int path_len, elemtype long_path, int &long_path_len) // 引用long_path_len帶回最長路徑長度

}else

}/*--------------------------採用後序(左、右、根)非遞迴遍歷方法輸出所有從葉子結點到根結點的逆路徑----------------------*/

static void all_path2(btnode *b)

r = null; // r指向剛剛訪問的結點,初始時為空

flag = true; // flag為真表示正在處理棧頂結點

while(top > -1 && flag) // 棧不空且flag為真時迴圈

top--; // 退棧

r = p; // r指向剛訪問過的結點

}else

}}while(top > -1); // 棧不空時迴圈

}typedef struct snode

snode; // 宣告順序佇列結點型別

/*--------------------------採用層次遍歷方法輸出所有從葉子結點到根結點的逆路徑----------------------*/

static void all_path3(btnode *b)

printf("%c\n", qu[pos].node->data); // 最後輸出根結點

}if(b->lchild != null) // 若有左孩子,將其進入佇列

if(b->rchild != null) // 若有右孩子,將其進入佇列}}

int main(int argc, char *ar**)

測試結果:

二叉樹b: a(b(d,e(h(j,k(l,m(,n))))),c(f,g(,i)))

先序遍歷方法:

d到根結點逆路徑: d->b->a

j到根結點逆路徑: j->h->e->b->a

l到根結點逆路徑: l->k->h->e->b->a

n到根結點逆路徑: n->m->k->h->e->b->a

f到根結點逆路徑: f->c->a

i到根結點逆路徑: i->g->c->a

第一條最長逆路徑長度: 7

第一條最長逆路徑: n m k h e b a

後序非遞迴遍歷方法:

d到根結點逆路徑: d->b->a

j到根結點逆路徑: j->h->e->b->a

l到根結點逆路徑: l->k->h->e->b->a

n到根結點逆路徑: n->m->k->h->e->b->a

f到根結點逆路徑: f->c->a

i到根結點逆路徑: i->g->c->a

層次遍歷方法:

d到根結點逆路徑: d->b->a

f到根結點逆路徑: f->c->a

i到根結點逆路徑: i->g->c->a

j到根結點逆路徑: j->h->e->b->a

l到根結點逆路徑: l->k->h->e->b->a

n到根結點逆路徑: n->m->k->h->e->b->a

輸出二叉樹中所有從根結點到葉子結點的路徑

輸出二叉樹中所有從根結點到葉子結點的路徑.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std struct btnode 先序建立二叉樹 void creatbtree btnode root else 輸出二...

輸出二叉樹中所有從根結點到葉子結點的路徑

輸出二叉樹中所有從根結點到葉子結點的路徑.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std struct btnode 先序建立二叉樹 void creatbtree btnode root else 輸出二...

二叉樹中從根結點到葉子結點所有路徑 非遞迴實現

非遞迴實現輸出二叉樹中從根節點到葉子節點的所路徑,我們用非遞迴的方法實現。我們在儲存節點時,用乙個標記域標記從當前節點出發的所有路徑是否已經被訪問過。如果當前節點的所有路徑都被訪問過,則標記域為一,只要有一條路徑沒有被訪問過,那麼標記域就是零。儲存路徑的陣列 儲存的是當前節點的指標 vectorpa...