二叉树的先序、中序、后序的递归与非递归实现

#include <iostream>
#include <cstdlib>
#include <stack>

using namespace std;

struct BinTree {
    int data;
    struct BinTree *left;
    struct BinTree *right;
};

struct BinPost {
    BinTree *pTree;
    bool isFirst;
};

void CreateBinTree(BinTree* &root)
{
    int data;
    cin>>data;
    if(data == 0)
        root = NULL;
    else {
        root = (BinTree*)malloc(sizeof(BinTree));
        root->data = data;
        CreateBinTree(root->left);
        CreateBinTree(root->right);
    }
}

void preOrderFirst(BinTree *root)
{
    if(root) {
        cout<<root->data<<' ';
        preOrderFirst(root->left);
        preOrderFirst(root->right);
    }
}

void inOrderFirst(BinTree *root)
{
    if(root) {
        inOrderFirst(root->left);
        cout<<root->data<<' ';
        inOrderFirst(root->right);
    }
}

void postOrderFirst(BinTree *root)
{
    if(root) {
        postOrderFirst(root->left);
        postOrderFirst(root->right);
        cout<<root->data<<' ';
    }
}
void preOrderSecond(BinTree *root)
{
    BinTree *p;
    stack<BinTree*> stk;
    stk.push(root);

    while(!stk.empty()) {
        p = stk.top();
        while(p != NULL) {
            cout<<p->data<<' ';
            p = p->left;
            stk.push(p);
        }
        stk.pop();
        if(!stk.empty()) {
            p = stk.top(); stk.pop();
            if(p) {
                p = p->right;
                stk.push(p);
            }
        }
    }
}

void inOrderSecond(BinTree *root)
{
    BinTree *p;
    stack<BinTree*> stk;
    stk.push(root);

    while(!stk.empty()) {
        p = stk.top();
        while(p != NULL) {
            p = p->left;
            stk.push(p);
        }
        stk.pop();
        if(!stk.empty()) {
            p = stk.top(); stk.pop();
            if(p) {
                cout<<p->data<<' ';
                p = p->right;
                stk.push(p);
            }
        }
    }
}

void postOrderSecond(BinTree *root)
{
    BinTree *p;
    BinPost *q;
    BinPost *post = (BinPost*)malloc(sizeof(BinPost));
    stack<BinPost*> stk;

    post->isFirst = true;
    post->pTree = root;
    stk.push(post);
    while(!stk.empty()) {
        q = stk.top();
        p = q->pTree;
        while(p != NULL) {
            p = p->left;
            post = (BinPost*)malloc(sizeof(BinPost));
            post->isFirst = true;
            post->pTree = p;
            stk.push(post);
        }

        stk.pop();

        if(!stk.empty()) {
            q = stk.top();
            p = q->pTree;
            if(q->isFirst) {
                q->isFirst = false;
                p = p->right;
                post = (BinPost*)malloc(sizeof(BinPost));
                post->isFirst = true;
                post->pTree = p;
                stk.push(post);
            } else {
                cout<<p->data<<' ';
                q->pTree = NULL;
            }
        }

    }
}

int main()
{
    BinTree *root;
    CreateBinTree(root);
    preOrderFirst(root);
    cout<<endl;
    preOrderSecond(root);
    cout<<endl;
    inOrderFirst(root);
    cout<<endl;
    inOrderSecond(root);
    cout<<endl;
    postOrderFirst(root);
    cout<<endl;
    postOrderSecond(root);
    cout<<endl;
    return 0;
}

时间: 2024-10-14 22:42:28

二叉树的先序、中序、后序的递归与非递归实现的相关文章

Java数据结构四之——二叉树的前、中、后序遍历

程序来自Program Creek 前 Preorder binary tree traversal is a classic interview problem about trees. The key to solve this problem is to understand the following: What is preorder? (parent node is processed before its children) Use Stack from Java Core lib

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

二叉树的前序、中序、后序、层次遍历的递归与非递归实现

二叉树的遍历有前序遍历.中序遍历.后序遍历.层次遍历等,笔者在这里总结一下各种遍历的实现. 一.前序遍历. 前序遍历访问节点顺序为:根节点->左子节点->右子节点. 递归实现如下: void preorder(TreeNode* root, vector<int>& nodes) { if (!root) return; nodes.push_back(root -> val); preorder(root -> left, nodes); preorder(r

二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历

对于一种数据结构而言,遍历是常见操作.二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树.二叉树的节点声明如下: 1 typedef struct TreeNode *PtrToNode; 2 typedef struct TreeNode *BinTree; 3 4 struct TreeNode 5 { 6 int Data; //为简单起见,不妨假设树节点的元素为int型 7 BinTree Left; 8 BinTree Right; 9 }; 二叉树的遍历主要有先序遍历

二叉树重建 - (先序遍历、中序遍历、后序遍历)

对于一棵二叉树T,我们可以递归定义它的先序遍历,中序遍历,后序遍历:  1.先序遍历  ( PreOrder(T) = T的根节点 + PreOrder(T的左子树) + PreOrder(T的右子树) ) 2.中序遍历  ( InOrder(T) = InOrder(T的左子树) + T的根节点 +  InOrder(T的右子树) ) 3.后序遍历  ( PostOrder(T) = PostOrder(T的左子树) + PostOrder(T的右子树)  + T的根节点 ) 其中,加号表

二叉树的先序、中序、后序、层次遍历的递归和非递归解法

二叉树的先序.中序.后序.层次遍历的递归和非递归解法 package tree; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class TreeTraverse { /** * 先序递归 * @param root */ public static void preOrderTraverse(TreeNode root) { if (root == null) { ret

LintCode(72)中序遍历和后序遍历树构造二叉树

题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1    3 分析 递归解决. Python代码 """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None "&q