二叉树遍历

递归遍历比较简单,本文主要总结非递归遍历。

前序遍历

前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。
对于任一结点P:

  1. 访问结点P,并将结点P入栈;
  2. 判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;
  3. 直到P为NULL并且栈为空,则遍历结束。
void preorder(TreeNode *root)
{
    stack<TreeNode*> s;
    TreeNode *p = root;
    while (p != NULL || !s.empty())
    {
        while (p != NULL)
        {
            cout<<p->val<<" ";
            s.push(p);
            p = p->left;
        }

        if (!s.empty())
        {
            p = s.top();
            s.pop();
            p = p->right;
        }
    }
}

中序遍历

中序遍历按照“左孩子-根结点-右孩子”的顺序进行访问。
对于任一结点P,

  1. 若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;
  2. 若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;
  3. 直到P为NULL并且栈为空则遍历结束
void inorder(TreeNode *root)
{
    stack<TreeNode*> s;
    TreeNode *p = root;
    while (p != NULL || !s.empty())
    {
        while (p != NULL)
        {
            s.push(p);
            p = p->left;
        }

        if (!s.empty())
        {
            p = s.top();
            cout<<p->val<<" ";
            s.pop();
            p = p->right;
        }
    }
}

后序遍历

后序遍历按照“左孩子-右孩子-根结点”的顺序进行访问。
要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

void postorder(TreeNode *root)
{
    if (root == NULL)
    {
        return;
    }
    stack<TreeNode*> s;
    s.push(root);
    TreeNode *pre = NULL;
    TreeNode *cur;
    while (!s.empty())
    {
        cur = s.top();
        if (cur->left == NULL && cur->right == NULL ||
            pre != NULL && (pre == cur->left || pre == cur->right))
        {
            cout<<cur->val<<" ";
            s.pop();
            pre = cur;
        }
        else
        {
            if (cur->right != NULL)
            {
                s.push(cur->right);
            }
            if (cur->left != NULL)
            {
                s.push(cur->left);
            }
        }
    }
}

层次遍历

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

建立二叉树:

     a
b        c
   d        e
--------------
void create(TreeNode *&p, const char *str, int& i)
{
    if (i < strlen(str) && str[i] == '#')
    {
        p = NULL;
    }
    else
    {
        p = new TreeNode(str[i] - '0');
        create(p->left, str, ++i);
        create(p->right, str, ++i);
    }
}

int main()
{
    TreeNode *root = NULL;
    char *str = "ab#d##c#e##";
    int i = 0;
    create(root, str, i);
}
时间: 2024-07-31 22:30:20

二叉树遍历的相关文章

二叉树遍历算法集合

二叉树遍历算法集合(前中后序遍历的递归和非递归算法,层序遍历算法) 费了两天时间写的,包括前中后序遍历的递归和非递归算法,还有层序遍历总共2*3 + 1 = 7中遍历二叉树的算法,感觉其中后序遍历的非递归算法比较困难,想了很久最后的实现还是不够优雅,请大家指正~~ 总共三个文件,一个头文件,一个对应的cpp文件,还有一个用于测试的文件. 头文件: /**//******************************************************************** c

二叉树遍历(递归)

// 测试二叉树遍历,递归算法 public class TestBinaryTree { public static void main(String[] args) { Node<String> g = new Node<String>("G", null, null): Node<String> e = new Node<String>("E", null, null): Node<String> f

@数据结构大神:递归实现二叉树遍历,图示行为什么错?

问题描述 @数据结构大神:递归实现二叉树遍历,图示行为什么错? # include<stdio.h> # include<stdlib.h> # include<malloc.h> # define Max_Size 2 typedef struct Node{ int data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; int x,k=0,n=0; void CreateBiTree(Bi

九度题目1184:二叉树遍历

题目1184:二叉树遍历 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2844 解决:1139 题目描述: 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串: ABC##DE#G##F### 其中"#"表示的是空格,空格字符代表空树.建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果. 输入: 输入包括1行字符串,长度不超过100. 输出: 可能有多组测试数据,对于每组数据, 输出将输入字符串建立

c++ c 树-不用栈的非递归二叉树遍历 求改正 (C++新手)

问题描述 不用栈的非递归二叉树遍历 求改正 (C++新手) 原程序如下,添加了双亲域parent和标志域mark:不知道哪里不对: #include""iostream""using namespace std;class BinTree; class BinNode{private: int data; BinNode *lchild;BinNode *rchild;BinNode *parent;int mark;friend class BinTree; };

关于c 二叉树---遍历疑问

问题描述 关于c 二叉树---遍历疑问 原码如下: //Program 11.7 Sorting integers using a binary tree #include #include #include //Function prototypes struct Node *createnode(long value); struct Node *addnode(long value,struct Node *pNode); void listnodes(struct Node *pNode

[华为机试练习题]10.二叉树遍历

题目 描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 题目类别: 树 难度: 中级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 两个字符串,其长度n均小于等于2

数据结构例程——二叉树遍历的非递归算法

本文是数据结构基础系列(6):树和二叉树中第11课时二叉树遍历非递归算法的例程. [二叉树遍历的非递归算法] 实现二叉树的先序.中序.后序遍历的非递归算法,并对用"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"创建的二叉树进行测试. 请利用二叉树算法库. [参考解答](btreee.h见算法库) #include <stdio.h> #include "btree.h" void PreOrder1(BTNode *b) {

数据结构关于二叉树遍历的一道题 在线等~

问题描述 数据结构关于二叉树遍历的一道题 在线等~ 利用栈的基本操作写出先序遍历二叉树的非递归算法 要求进栈的元素最少, 并指出下列二叉树中需进栈的元素. 这是答案: 根据上述代码, (1)左子树lchild不需要入栈吗? (2)入栈顺序是什么? (3)最后一行代码 if (top>0) bt=s[top--] 是什么意思? (4)如果是中序或后序,入栈顺序又是什么? 谢谢大神们啦~~ O(∩_∩)O 解决方案 3 if (top>0) bt=s[top--] 出栈.取出top位置的元素,并且

c语言-关于二叉树遍历问题,求问错在哪里。。。

问题描述 关于二叉树遍历问题,求问错在哪里... //二叉树的遍历 //按先序序列建立一棵二叉树,按照ABC@@D@@E@F@@输入字符,@代表层数并查找D所在层数 //定义二叉树 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; //按先序创建一棵二叉树 void creatBiTree(BiTree *T) { char c; cin >> c; if (c == '