zoukankan      html  css  js  c++  java
  • 二叉树的非递归遍历

    二叉树,就是每个节点最多只有两个子节点类树结构(应该二叉树可以为空,但是树的定义要求树不为空,所以我称他为类树结构)。

    二叉树的非递归遍历的泛华代码与解释如下:

    首先定义二叉树的二叉链结构

    template<typename NT>
    struct BTnood{
        NT data;
        BTnood* lc;
        BTnood* rc;
        BTnood(NT const& v=NT(),BTnood* lc_=0,BTnood* rc_=0):data(v),lc(lc_),rc(rc_){}
        bool haslc(){return !lc==0;}
        bool hasrc(){return !rc==0;}
    };

    首先是二叉树的非递归先序遍历:

    其实思路就是递归遍历的循环方式实现而已。

    首先访问输出根节点,当该节点有右子节点的时候先把其压栈,然后访问左子节点,并把左子节点作为新的根节点,知道最深层的根节点没有子节点为止,然后出栈访问左子节点-》右子节点:

    //先序遍历 --- 非递归
    template<typename NT>
    void preorder(NT* root,void (*Visit)(NT*))
    {
    	if(root!=0)
    	{
    		std::stack<NT*> s;
    		while(true)
    		{
    			Visit(root);
    			if(root->hasrc()) s.push(root->rc);
    			if(root->haslc()) s.push(root->lc());
    			else
    			{
    				if(s.empty()) return;
    				root = s.top();s.pop();
    			}
    		}
    	}
    }
    

      

    二叉树的非递归中序遍历:

    中序遍历的访问顺序是,左子节点->根节点->右子节点

    那么就要先找到最深处的左子节点啊,所以在while循环中,将所有左子节点入栈,知道没有左子节点时就可以输出其本身,然后判断是否有右子节点,如果有则入栈,进入下一轮循环以便判断其是否有左子节点需要先与其输出

    //中序遍历 非递归
    template<typename NT>
    void inorder(NT* root,void (*Visit)(NT*))
    {
        if(root == 0) return;
        std::stack<NT*> s;
        s.push(root);
        while(true)
        {
            root = s.top();
            while(root->haslc()) s.push(root=root->lc);
            Visit(root);
            if(root->hasrc()) s.push(root->rc);
            else
            {
                do
                {
                    Visit(root=s.top());
                    s.pop();
                }while(!root->hasrc()||!s.empty());
            }
        }
    }
  • 相关阅读:
    mouse_event,keybd_event
    构造自己的StringGrid
    BMP2JPG,JPG2BMP
    $J的用法
    一个简单的系统托盘程序
    构造自己的双向链表
    C++的iostream标准库介绍
    D3DXVec4Dot 函数
    3D游戏从头编之D3D(3)
    D3DXVec4Cross 函数
  • 原文地址:https://www.cnblogs.com/imhurley/p/2713734.html
Copyright © 2011-2022 走看看