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

    二叉树的递归先序遍历很简单,假设二叉树的结点定义如下:

    1 struct BinaryTreeNode
    2 {
    3     int m_nValue;
    4     BinaryTreeNode*  m_pLeft;
    5     BinaryTreeNode*  m_pRight;
    6 };

    递归先序遵循:根-左-右的顺序

    1 void PreOrder(BinaryTreeNode* Root)
    2 {
    3     if(Root==NULL)
    4         return;
    5     
    6     cout<<Root->m_nValue<<endl;
    7     PreOrder(Root->m_pLeft);
    8     PreOrder(Root->m_pRight);    
    9 }

    非递归我们以一个例子说明,仍然以之前博文的一个二叉树说明:

    1                 8
    2                /  
    3               6   10
    4              /   / 
    5             5  7  9 11

    非递归步骤:

    1.我们先定义一个栈S,栈的每个元素为二叉树节点类型结点

    2.首先将根节点压入S中,输出根节点,同时弹出栈顶节点 (输出8)

    3.由于非递归的实质仍然是先根再左后右的顺序,然而对于根结点的左右子节点来说要先访问左节点那么必须先把右先节点压栈

    4.现在S中从栈顶到栈底有6,10,现在以输出并弹出栈顶元素(输出8,6)

    5.继续将节点6的左右子节点加入到栈S中,从栈顶到栈底有5,7,10

    6.输出并弹出栈顶元素,由于此时节点5没有子结点则一种弹出直到有子结点的节点10,则从栈顶到(输出8,6,5,7)此时栈顶到栈顶10

    7 弹出并输出栈顶节点元素10,此时将其左右子节点入栈S,此时栈顶到栈底9,11(输出8,6,5,7,10)

    8.由于节点9和11都没有子节点则一直弹出并输出(输出8、6、5、7、10、9、11)

    代码实现如下:
    (函数PreOrder为递归先序遍历函数,PreOrderNew为非递归先序遍历函数)

     1 #include <iostream>
     2 #include <stack>
     3 using namespace std;
     4 
     5 struct BinaryTreeNode
     6 {
     7     int m_nValue;
     8     BinaryTreeNode*  m_pLeft;
     9     BinaryTreeNode*  m_pRight;
    10 };
    11 
    12 
    13 void CreateTree(BinaryTreeNode** Root)
    14 {
    15     int data;
    16     cin>>data;
    17     if(data==0)
    18     {
    19         *Root=NULL;
    20         return;
    21     }
    22     else
    23     {
    24         *Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
    25         (*Root)->m_nValue=data;
    26         CreateTree(&((*Root)->m_pLeft));    
    27         CreateTree(&((*Root)->m_pRight));
    28     }
    29 }
    30 
    31 
    32 void PreOrder(BinaryTreeNode* Root)
    33 {
    34     if(Root==NULL)
    35         return;
    36     
    37     cout<<Root->m_nValue<<endl;
    38     PreOrder(Root->m_pLeft);
    39     PreOrder(Root->m_pRight);    
    40 }
    41 
    42 void PreOrderNew(BinaryTreeNode* Root)
    43 {
    44     if(Root==NULL)
    45         return;
    46     
    47     stack<BinaryTreeNode*> S;
    48 
    49     S.push(Root);
    50 
    51     while(!S.empty())
    52     {
    53         BinaryTreeNode* Temp=S.top();
    54         S.pop();
    55         cout<<Temp->m_nValue<<",";
    56 
    57         if(Temp->m_pRight!=NULL)
    58         {
    59             S.push(Temp->m_pRight);
    60         }
    61 
    62         if(Temp->m_pLeft!=NULL)
    63         {
    64             S.push(Temp->m_pLeft);
    65         }
    66     }
    67     
    68 }
    69 
    70 int main()
    71 {
    72     BinaryTreeNode* root;
    73     cout<<"Please input the tree node data(0-exit):
    ";
    74     CreateTree(&root);
    75     cout<<"The PreOrder of Binary Tree:
    ";
    76     PreOrder(root);
    77     cout<<endl;
    78     cout<<"The PreOrder New of Binary Tree:
    ";
    79     PreOrderNew(root);
    80     cout<<endl;
    81     return 0;
    82 }

    运行结果:

  • 相关阅读:
    第8.13节 Python类中内置方法__repr__详解
    Python中splitlines方法判断文本中一行结束除了回车换行符是否还有其他字符?
    Python中使用eval执行下面函数的结果怎么是字符串'10020'?
    第8.12节 Python类中使用__dict__定义实例变量和方法
    ThinkPHP---thinkphp拓展之空操作
    ThinkPHP---TP功能类之邮件
    ThinkPHP---案例--实现知识管理功能
    ThinkPHP---TP功能类之公文管理功能2----------继续完善
    ThinkPHP---TP拓展之获取IP信息
    ThinkPHP---layer插件
  • 原文地址:https://www.cnblogs.com/vpoet/p/4681420.html
Copyright © 2011-2022 走看看