非递归遍历二叉树

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

typedef struct node
{
    int flag;
    char value;
    struct node *lchild;
    struct node *rchild;
}Node, *PNode;

void CreateBinaryTree(PNode &root)                   /* 前序遍历的递归方式动态建立二叉树 */
{
    char ch;
    scanf("\n%c", &ch);
    if(ch == ‘#‘) {root = NULL; return ;}
    root = (Node *)malloc(sizeof(Node));
    root->flag = 0;                                  // flag==0 ---> 第一次经过:父节点-->自身-->左孩子
                                                     // flag==1 ---> 第二次经过:左孩子-->自身-->右孩子
                                                     // flag==2 ---> 第三次经过:右节点-->自身-->父节点
    root->value = ch;
    CreateBinaryTree(root->lchild);
    CreateBinaryTree(root->rchild);
}
void visit(PNode &pointer)
{
    printf("%c ", pointer->value);
}
void OrderTraversal(PNode &root)                     /* 调整visit(temp)出现位置实现前中后序遍历 */
{
    stack<Node> ss;
    PNode temp = root;

    while(!ss.empty() || temp->flag!=2               /* while内部:if --- else if --- else 结构 */
    {
        if(temp->flag == 0)
        {
            visit(temp);                             // PreorderTraversal
            if(temp->lchild != NULL)
            {
                temp->flag = 1;
                ss.push(*temp);
                temp = temp->lchild;
            }
            else
            {
                //visit(temp);                       // InorderTraversal / PostorderTraversal
                temp = &(ss.top());
                ss.pop();
            }
        }
        else if(temp->flag == 1)
        {
            //visit(temp);                           // InorderTraversal
            temp->flag = 2;
            ss.push(*temp);
            temp = temp->rchild;
        }
        else
        {
            //visit(temp);                           // PostorderTraversal
            temp = &(ss.top());
            ss.pop();
        }
    }
    //visit(temp);                                   // PostorderTraversal
}
int main()
{
    cout << "Input element in preorder:" << endl;
    PNode root;
    CreateBinaryTree(root);
    OrderTraversal(root);
    return 0;
}
时间: 2024-10-12 12:01:57

非递归遍历二叉树的相关文章

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

【转】更简单的非递归遍历二叉树的方法

解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所以网上出现无数的介绍二叉树非递归遍历方法的文章.可是大家需要的真是那些非递归遍历代码和讲述吗?代码早在学数据结构时就看懂了,理解了,可为什么我们一而再再而三地忘记非递归遍历方法,却始终记住了递归遍历方法? 三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担.

重拾算法(1)——优雅地非递归遍历二叉树及其它

重拾算法(1)——优雅地非递归遍历二叉树及其它 本文中非递归遍历二叉树的思想和代码都来自这里(http://jianshu.io/p/49c8cfd07410#).我认为其思想和代码都足够优雅动人了,于是稍作整理,得到如下的程序. 前中后序遍历二叉树 1 public class BinaryTreeNode<T> 2 { 3 public T Value { get;set; } 4 public BinaryTreeNode<T> Parent { get;set; } 5 p

非递归遍历二叉树Java实现

2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Binary Tree Preorder Traversal 问题描述: 问题求解: 先序遍历就是在第一次访问到节点的时候将其值进行打印,然后递归打印其左子树,最后递归打印其右子树. 解法一.双while public List<Integer> preorderTraversal(TreeNode

非递归遍历二叉树的前序中序后序

/** * 二叉树先序遍历,非递归算法 * 1.申请一个新的栈,记为stack.然后将头节点head压入stack中. * 2.从stack弹出栈顶节点,记为cur,然后打印cur节点的值,再将cur右孩子(不为空) * 压入stack中,最后将cur的左孩子(不为空)压入stack中 * 3.不断重复步骤2,直到stack为空,全部过程结束. * @param head */ public void preOrderNoRecur(Node head){ System.out.print("非

非递归遍历二叉树之中序遍历

//中序遍历int inorder_tree_walk(BinTreeNode * root){ if(root == NULL){ return -1; } stack<BinTreeNode *> s; BinTreeNode * p = root; while(!s.empty() || p != NULL) { while(p != NULL){ s.push(p); p = p->lchild; } p = s.top(); s.pop(); cout << p-&

非递归遍历二叉树之前序遍历

前序遍历二叉树 int preorder_tree_walk(BinTreeNode * root){ if(root == NULL){ return -1; } stack<BinTreeNode *> s; BinTreeNode * p = root; while(!s.empty() || p != NULL) { while(p != NULL){ cout << p->key<< endl; s.push(p); p = p->lchild;

非递归遍历二叉树【层次遍历,先序、中序、后序遍历】

一.层次遍历:借助队列实现 1 void LevelOrderTraversal(BiTree root) 2 { 3 BiTree e = root;//从根节点开始 4 Queue *q; 5 InitQueue(q); 6 7 if(e)//若根结点非空,则入队列 8 { 9 EnQueue(q,e); 10 } 11 12 while(!QueueEmpty(q)) 13 { 14 DelQueue(q,e); 15 Visit(e); 16 if(e->leftChild)//左孩子不