关闭

二叉树前中后序遍历(递归)

标签: 递归二叉树
470人阅读 评论(0) 收藏 举报
分类:

中途对于递归总是理不清,后来看了代码和书才想通:

这里写图片描述

递归==递+归:必须要有递归结束条件,可以不是返回值,若调用一个递归的主算法为第0层算法,则从主算法调用递归算法为进入第1层调用,从第i层递归调用本算法为进入第i+1层,反之,退出第i层递归调用,则返回至第i-1层调用,简单讲:就是当第i+1层达到了递归结束条件,就会回到第i层递归(当时一直认为直接执行到第i+1层,就不再返回了。呵呵),为了保证递归调用正确执行,系统要建立递归调用工作栈。每一层递归调用所需的信息构成一个工作记录,其中,包括所有实参指针,所有局部变量以及返回上一层的地址

#include<iostream>
using namespace std;
template<class T>
struct BinaryTreeNode
{
    BinaryTreeNode* _left;
    BinaryTreeNode* _right;
    T _data;
    BinaryTreeNode(const T& x)
        :_left (NULL)
        ,_right (NULL)
        ,_data (x)
    {}
};

template<class T>
class BinaryTree 
{
public:
    BinaryTree()
        :_root(NULL)
    {}
    BinaryTree(const T* a,size_t size)
    {  
        size_t index = 0;
        _root = _CreateTree(a,size,index);//构建树
    }

    BinaryTree (const BinaryTree<T>& s)
        :_root ->_left(s._root ->_left )
        ,_root ->_right(s._root ->_right )
        ,_root ->_data(s._root ->_data )
    {
        s._root ->_left = NULL;
        s._root ->_right = NULL;
    }

    size_t size()
    {
        return _size(_root);
    }

    size_t Depth()
    {
        return _Depth(_root);
    }

    size_t leafSize()
    {
        return _leafSize(_root);
    }

    void prevorder()//前序遍历《根左右》
    {
        _prevorder(_root); 
        cout <<endl;
    }

    void Inorder()//中序遍历《左根右》
    {
        _Inorder(_root);
        cout<<endl;
    }

    void postorder()//后序遍历《左右根》
    {
        _postorder(_root);
        cout<<endl;
    }
public:
    BinaryTreeNode<T>* _CreateTree(const T* a,size_t size,size_t& index)
    {  
        BinaryTreeNode<T>* root = NULL;
        if(a[index] != '#'&& index < size)
        {
            root = new BinaryTreeNode<T>(a[ index ]);//创建树节点
            root->_left = _CreateTree(a,size,++index);
            root->_right = _CreateTree(a,size,++index);

        }
        return root;
    }

    size_t _size(BinaryTreeNode<T>* root)//节点个数
    {
        if(root == NULL)
        {
            return 0;
        }
        return (_size( root->_left ))+(_size ( root->_right ))+1;//每递归一次都加上他的上个节点,也就是根节点。所以只加一
    }

    size_t _Depth(BinaryTreeNode<T>* root)//树的深度
    {
        if(root == NULL)
            return 0;
        size_t a = _Depth (root->_left )+1;
        siez_t b = _Depth (root->_right)+1;
        return a>b?a:b;
    }

    size_t _leafSize(BinaryTreeNode<T>* root)  //叶个数
    {
        if(root == NULL)
            return 0;
        else if(root->_left  ==NULL && root->_right == NULL )
            return 1;
        else
            return _leafSize(root ->_left)+_leafSize (root->_right );
    }

    void _prevorder(BinaryTreeNode<T>* root)
    {
        if(root == NULL)
            return ;
        cout<<root->_data <<" ";
        _prevorder(root->_left );
        _prevorder(root->_right );

    }

    void _Inorder(BinaryTreeNode<T>* root)
    {
        if(root != NULL)
        {
            _Inorder(root->_left );
            cout<<root->_data <<" ";
            _Inorder(root->_right );
        }
    }

    void _postorder(BinaryTreeNode<T>* root)
    {
        if(root != NULL )
        {
            _postorder(root->_left );
            _postorder(root->_right );
            cout<<root->_data <<" ";
        }
    }

protected:
    BinaryTreeNode<T>* _root;

};
int main()
{  
    int a1[9]={1,2,3,'#',4,'#','#',5, 6};
    int a2[15] = {1,2,'#',3,'#','#',4,5,'#',6,'#',7,'#','#',8};
    BinaryTree<int> bt(a1,9);
    bt.prevorder ();
    bt.Inorder ();
    bt.postorder ();
    return 0;
}
0
0
查看评论

外挂学习之路(14)--- 游戏中的二叉树

最近有点懒了,两个月前就准备总结地传说中的二叉树在游戏逆向里是怎么回事,一直拖到现在,今天还是不能完成(慢慢知道自己最终不能成就什么大事的原因了,,做什么事都不能持持之以恒),不过得先写下辩题提醒自己,这件事早晚都要做的,
  • liujiayu2
  • liujiayu2
  • 2017-04-17 20:00
  • 747

逆向学习笔记-基于EBP的栈帧

程序的OEP,一开始以 Push EBP 和MOV Ebp,Esp这两句开始。 原因:c程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的: 1.让EBP保存ESP的值。 2.在程序运行完毕的时候调用 ...
  • li898445911a
  • li898445911a
  • 2013-09-13 11:34
  • 1182

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的:
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014-07-06 22:14
  • 65043

C语言实现二叉树的后序遍历(递归)

  • 2011-12-13 23:37
  • 32KB
  • 下载

数据结构 二叉树遍历之前序、中序、后序以及层次遍历实现

二叉树遍历之前序、中序、后序以及层次遍历实现
  • susidian
  • susidian
  • 2015-08-16 23:38
  • 717

二叉树递归非递归遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法。方法一:形式化模拟转换。方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法。而此次正好是利用第二种按方法求解。1.1非递归前序遍历:首先利用下图来设计非递归前序遍历算法思想: 堆栈结构体如下:#define size 100 t...
  • xiaofei__
  • xiaofei__
  • 2016-05-30 21:28
  • 3984

二叉树的创建、先序、中序以及后序遍历

二叉树结点结构与双链表结点结构式类似的,只是
  • zhonghua18517
  • zhonghua18517
  • 2014-06-01 14:11
  • 1697

算法题目-二叉树前中后序遍历

前序:根-左-右 中序:左-根-右 后序:左-右-根 实现: class TreeNode1 { int val = 0; TreeNode1 left = null; TreeNode1 right = null; public TreeNode1(int val)...
  • lynn_Kun
  • lynn_Kun
  • 2017-06-14 13:46
  • 265

剑指offer面试题6 前序遍历&中序遍历,后序遍历&中序遍历重构二叉树

重构二叉树目前主要是采取递归的方式 目前只能通过前序,中序 或者 后续,中序进行重构 前序和后序是不能够重构的,举个例子:  前序: 1 2 4 7 3 5 6 8  后续: 7 4 2 5 8 6 3 1  是无法判断出7是节点4的左孩子还是右孩子的 首先讲解利用...
  • xietingcandice
  • xietingcandice
  • 2015-01-10 21:58
  • 1159
    个人资料
    • 访问:44189次
    • 积分:1124
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条