五 树和二叉树

二叉树的定义

typedef struct node {
    char data;
    struct node * lchild;
    struct node * rchild;
} BTNode;

void InitBT(BTNode * &b) {
    b = (BTNode *) malloc(sizeof(BTNode));
    b->lchild = NULL;
    b->rchild = NULL;
}

二叉树的递归遍历

前序遍历

void PreOrder(BTNode * b) {
    if(b) {
        cout << b->data << " ";
        PreOrder(b->lchild);
        PreOrder(b->rchild);
    }
}

中序遍历

void InOrder(BTNode * b) {
    if(b) {
        InOrder(b->lchild);
        cout << b->data << " ";
        InOrder(b->rchild);
    }
}

后序遍历

void PostOrder(BTNode * b) {
    if(b) {
        PostOrder(b->lchild);
        PostOrder(b->rchild);
        cout << b->data << " ";
    }
}

二叉树的非递归遍历

层次遍历

void LevelOrder(BTNode *b) {
    queue< BTNode* > q;
    q.push(b);
    while(!q.empty()) {
        BTNode * now = q.front();
        q.pop();
        cout << now->data << " ";
        if(now->lchild)
            q.push(now->lchild);
        if(now->rchild)
            q.push(now->rchild);
    }
}

非递归先序遍历2种写法

void PreOrder1(BTNode * b) {
    BTNode * p;
    stack<BTNode *> st;
    if(b) {
        st.push(b);
        while(!st.empty()) {
            p = st.top();
            st.pop();
            cout << (p->data) << " ";
            if(p->rchild)
                st.push(p->rchild);
            if(p->lchild)
                st.push(p->lchild);
        }
        cout << endl;
    }
}

void PreOrder2(BTNode * b) {
    BTNode * p = b;
    stack<BTNode *> st;
    while(!st.empty() || p) {
        while(p) {
            cout << p->data << " ";
            st.push(p);
            p = p->lchild;
        }
        if(!st.empty()) {
            p = st.top();
            st.pop();
            p = p->rchild;
        }
    }
    cout << endl;
}

非递归中序遍历

void InOrder1(BTNode * b) {
    BTNode *p = b;
    stack<BTNode *> st;
    while(!st.empty() || p) {
        while(p) {
            st.push(p);
            p = p->lchild;
        }
        if(!st.empty()) {
            p = st.top();
            st.pop();
            cout << p->data << " ";
            p = p->rchild;
        }
    }
    cout << endl;
}

比较前序(2)和中序,发现两者区别只是入栈时输出还是出栈时输出

非递归后序遍历

void PostOrder1(BTNode *b) {
    BTNode *p = b, *r = NULL;
    stack<BTNode *> st;
    while(p || !st.empty()) {
        if(p) {
            st.push(p);
            p = p->lchild; //一边入栈一边往左
        } else { //最左边
            p = st.top(); //读取栈顶到p
            if(p->rchild && p->rchild != r) { //如果p又右子树,且没有被访问,则后序遍历右子树
                st.push(p->rchild); //右子树入栈
                p = p->rchild->lchild; //以相同的方式遍历右子树(往最左边跑)
            } else { //否则可以访问p了(因为p的右子树为空或者被访问了,当然左子树也被访问了)
                st.pop(); //p出栈
                cout << p->data << " ";
                r = p; //记录最近被访问的结点(如果p是它父亲的右结点,就代表下次可以访问p的父亲了)
                p = NULL; //重置p结点
            }
        }
    }
    cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值