資料結構-從底向上層次遍歷二叉樹
阿新 • • 發佈:2019-02-06
【題目來自灰灰考研】
二叉樹採用二叉連結串列進行儲存(如下所示),每個結點包含資料域Data,左孩子指標域left和右孩子指標域right。請設計演算法給定一顆樹,返回其節點值從底向上的層次序遍歷(按從葉節點所在層到根節點所在的層遍歷,然後逐層從左往右遍歷)。
Typedef struct BitNode{
TElemType data;
struct BitNode *left, *right;
} *BiTree ;
樣例
給出一棵二叉樹 {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
按照從下往上的層次遍歷為:
[ [15,7], [9,20], [3] ]
#include<iostream> #include<cstdio> #include<cstdlib> #define MAXSIZE 20 using namespace std; typedef struct TNode{ char data; struct TNode *lChild, *rChild; }TNode; TNode *createBTree() { //124##57###38#9### TNode *node; char data; cin>>data; if(data == '#') return NULL; else { node = (TNode*)malloc(sizeof(TNode)); node->data = data; node->lChild = createBTree(); node->rChild = createBTree(); } return node; } void reverseLevelVisit(TNode *root) { /* 使用層次遍歷+棧就可以了 但是注意一點,在正常層序遍歷的時候 當遍歷到一個節點時,首先將該節點壓入棧中 如果其有右孩子節點,先將其右節點入佇列, 如果有左孩子節點,再將其左孩子節點入棧,一定不能搞反了 因為只有這樣出棧的時候才是從左到右訪問的 */ int front = 0, rear = 0; TNode *queue[MAXSIZE], *p; TNode *stack[MAXSIZE]; int top = -1; rear = (rear + 1) % MAXSIZE; queue[rear] = root; while(rear != front) { front = (front + 1) % MAXSIZE; p = queue[front]; stack[++top] = p; if(p->rChild) { rear = (rear + 1) % MAXSIZE; queue[rear] = p->rChild; } if(p->lChild) { rear = (rear + 1) % MAXSIZE; queue[rear] = p->lChild; } } while(top != -1) { p = stack[top--]; cout<<p->data<<" "; } cout<<endl; } int main() { TNode *root; root = createBTree(); reverseLevelVisit(root); return 0; }