二叉树的前 中 后序遍历,递归和非递归实现以及转换成双向链表

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;


struct TreeNode {
    int val;
    TreeNode *left, *right;
};


// 递归遍历
void recursion(TreeNode *root) {
    if (root == NULL)
        return ;


    //前序
    //cout << root->val << endl;


    recursion(root->left);


    //中序
    cout << root->val << endl;


    recursion(root->right);


    //后序
    //cout << root->val << endl;
}


// 非递归前序遍历
void pre_print(TreeNode* root) {
    if (root == NULL)
        return;


    std::stack<TreeNode*> treeStack;


    while(root != NULL || !treeStack.empty()) {
        // left node
        while(root != NULL) {
            cout << root->val << endl;
            treeStack.push(root);
            root = root->left;
        }


        root = treeStack.top();
        treeStack.pop();


        // right node
        root = root->right;
    }
}


// 非递归中序遍历
void mid_print(TreeNode* root) {
    if (root == NULL)
        return;


    std::stack<TreeNode*> treeStack;


    while(root != NULL || !treeStack.empty()) {
        // left node
        while(root != NULL) {
            treeStack.push(root);
            root = root->left;
        }


        root = treeStack.top();
        treeStack.pop();
        cout << root->val << endl;


        // right node
        root = root->right;
    }
}


// 非递归后序遍历
void post_print(TreeNode* root) {
    if (root == NULL)
        return;


    std::stack<TreeNode*> treeStack;
    TreeNode* last = root;


    while(root != NULL || !treeStack.empty()) {
        // left node
        while(root != NULL) {
            treeStack.push(root);
            root = root->left;
        }


        root = treeStack.top();
        if (root->right == NULL || root->right == last) {
            last = root;
            treeStack.pop();
            cout << root->val << endl;
            root = NULL;
        }
        else {
            // right node
            root = root->right;
        }
    }
}


void Convert2List(TreeNode* root) {
    if (root == NULL)
        return root;


    std::stack<TreeNode*> treeStack;
    TreeNode* listHead = NULL, *last = NULL;


    while(root != NULL || !treeStack.empty()) {
        while(root != NULL) {
            treeStack.push(root);
            root = root->left;
        }


        root = treeStack.top();
        treeStack.pop();


        if (listHead == NULL) {
            listHead = root;
            root->left = NULL;
        }
        else {
            last->right = root;
            root->left = last;
        }
        last = root;


        root = root->right;
    }


    for(root = listHead; root != NULL; root = root->right)
        cout << root->val << endl;
}


TreeNode* creatNode(int value) {
    TreeNode* p = new TreeNode();
    p->val = value;
    p->left = p->right = NULL;
    return p;
}


TreeNode* creatTree() {
    TreeNode *root = NULL;
    root = creatNode(10);
    root->left = creatNode(6);
    root->right = creatNode(14);
    root->left->left = creatNode(4);
    root->left->right = creatNode(8);
    root->right->left = creatNode(12);
    root->right->right = creatNode(16);
    return root;
}


int main() {
    TreeNode *root = creatTree();


    recursion(root);


    cout << endl;
    pre_print(root);


    cout << endl;
    root = creatTree();
    mid_print(root);




    cout << endl;
    root = creatTree();
    post_print(root);




    cout << endl;
    root = creatTree();
    Convert2List(root);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值