二叉树前中后、层次遍历

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

/*
二叉树遍历算法递归+非递归:
前序遍历:根->左->右
中序遍历:左->根->右
后序遍历:左->右->根
层次遍历
*/
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x): val(x),left(NULL),right(NULL) {}
};

/*递归版本*/
void prerecusive(TreeNode *root)
{
    if (!root) return;
    cout << root->val << " ";
    prerecusive(root->left);
    prerecusive(root->right);
}
void inrecusive(TreeNode *root)
{
    if (!root) return;
    inrecusive(root->left);
    cout << root->val << " ";
    inrecusive(root->right);
}
void postrecusive(TreeNode *root)
{
    if (!root) return;
    postrecusive(root->left);
    postrecusive(root->right);
    cout << root->val << " ";
}

/*循环版本。栈做辅助*/
void preiteration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    s.push(root);
    while (!s.empty())
    {
        cout << s.top()->val << " ";
        s.pop();
        if (root->right) s.push(root->right);
        if (root->left) s.push(root->left);
    }
}
void initeration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    TreeNode *curr = root;
    while (curr || !s.empty())//s没有值,第一个判断条件是curr不是空
    {
        if (curr)
        {
            s.push(curr);
            curr = curr->left;
        }
        else
        {
            cout << s.top()->val << " ";
            curr = s.top()->right;
            s.pop();
        }
    }
}
void postiteration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    s.push(root);
    TreeNode *curr;
    TreeNode *visited;//记录子节点已经访问过
    while (!s.empty())
    {
        curr = s.top();
        /*
         * 出栈条件:
         * 对于叶子节点:直接弹出
         * 对于非叶子节点:如果已经遍历过其左子节点或右子节点,则弹出
         */
        if ((!curr->left && !curr->right) || (visited && (curr->left==visited || curr->right == visited)))
        {
            cout << curr->val << " ";
            visited = curr;
            s.pop();
        }
        else
        {
            if (curr->right) s.push(curr->right);
            if (curr->left) s.push(curr->left);
        }
    }
}

void leveltraverse(TreeNode *root)
{
    if (!root) return;
    queue<TreeNode *> q;
    TreeNode *curr;
    q.push(root);
    while (!q.empty())
    {
        curr = q.front();
        cout << curr->val << " ";
        q.pop();
        if (curr->left) q.push(curr->left);
        if (curr->right) q.push(curr->right);

    }
}

原文地址:https://www.cnblogs.com/beixiaobei/p/10914253.html

时间: 2024-11-05 01:28:39

二叉树前中后、层次遍历的相关文章

Qt实现 动态化遍历二叉树(前中后层次遍历)

binarytree.h 头文件 1 #ifndef LINKEDBINARYTREE_H 2 #define LINKEDBINARYTREE_H 3 #include<c++/algorithm> 4 #include<c++/cstdio> 5 #include<string> 6 #include<c++/string> 7 #include<c++/vector> 8 #include<vector> 9 #include&

二叉树前中后递归遍历

1 public class Node { 2 public int value; 3 public Node left; 4 public Node right; 5 6 public Node (int data){ 7 this.value = data; 8 } 9 } 1 public class BinaryTreeMethod { 2 3 /** 4 * 二叉树递归前序遍历 5 * @param head 6 */ 7 public void preOrderRecur(Node

二叉树前中后序遍历递归转循环

通过观察递归实现,用循环和栈模拟递归实现中结点入栈和出栈的过程. #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl using namespace std; typedef long long LL; struct Node { int val; Node *left, *right; Node() : left(NULL), ri

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

package MyExc; import java.util.Stack; class TreeNode{ int data; TreeNode left; TreeNode right; } public class BinaryTree { public void preOrder(TreeNode head){ Stack<TreeNode> stack = new Stack<>(); stack.add(head); while(!stack.isEmpty()){ h

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

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

二叉树的建立及其前中后序遍历

1 //二叉树存储结构: 2 struct node 3 { 4 Int data; 5 node *lchild; 6 node *rchild; 7 }; 8 9 //二叉树在建树前根节点不存在: 10 Node *root = NULL; 11 12 //新建结点: 13 node *newNode(int v) 14 { 15 node *Node = new node; 16 Node->data = v; 17 Node->lchild = NULL; 18 Node->rc

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

POJ 2255 Tree Recovery &amp;&amp; Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

链接:poj.org/problem?id=2255 题意: 分别给你一个二叉树的前序遍历序列和中序遍历序列,让你给出这个二叉树的后序遍历序列. 思路: 对于二叉树的三种遍历方式,都可以使用递归来实现,那么也一定可以使用递归来拆解,以达到从遍历序列确定二叉树具体结构的目的.对于前序遍历来说,第一个字母一定是根,并且在序列中根的左子树包含的点一定出现在根的右子树的前面.对于中序遍历序列来说,根前面出现的字母所代表的点一定出现在左子树中,根后面出现的字母所代表的点一定出现在右子树中.在根据前序与中序