【数据结构】二叉树自下而上从右到左遍历

二叉树自下而上从右到左遍历实际上就是层序遍历的逆向操作,下面是层序遍历的代码

void LayerOrder(BiTree BT) {
    if (BT == NULL)
        return;
    queue B;
    BiTNode *p = BT;
    B.push(p);
    while (!B.empty()) {
        p = B.front();
        if (p->lchild)
            B.push(p->lchild);
        if (p->rchild)
            B.push(p->rchild);
        cout<data<<" ";
        B.pop();
    }
}

遍历过程如图所示

【数据结构】二叉树自下而上从右到左遍历_第1张图片

可以看二叉树自下而上从右到左遍历实际上就是对这个队列进行反向输出,自然而然可以想到应该利用栈

所以可以直接在节点入队的同时压入栈中,当所有节点压入栈(队空)时,出栈的序列即为所求

#include
#include
#include
using namespace std;
typedef struct BiTNode {
    char data;
    BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

BiTree CreateBT() {
    BiTree BT;
    char a;
    cin>>a;
    if (a == '.')
        return NULL;
    BT = new BiTNode;
    BT->data = a;
    BT->lchild = CreateBT();
    BT->rchild = CreateBT();
    return BT;
}

void ReverseOrder(BiTree BT) {
    if (BT == NULL)
        return;
    queue B;
    stack S;
    BiTNode *p = BT;
    B.push(p);
    while (!B.empty()) {
        p = B.front();
        // 队头压栈,栈中得到逆层次遍历序列
        S.push(p);

        if (p->lchild)
            B.push(p->lchild);
        if (p->rchild)
            B.push(p->rchild);
        B.pop();
    }
    while (!S.empty()) { // 打印栈中内容
        cout<data<<" ";
        S.pop();
    }
}

int main() {
    BiTree BT = CreateBT();
    ReverseOrder(BT);
    return 0;
}

// 测试用例
ABDG.J..HK...EI...CF...

// 遍历结果
K J I H G F E D C B A

 

你可能感兴趣的:(数据结构,数据结构,二叉树,遍历)