二叉树非递归先序遍历

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

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):\n";
74     CreateTree(&root);
75     cout<<"The PreOrder of Binary Tree:\n";
76     PreOrder(root);
77     cout<<endl;
78     cout<<"The PreOrder New of Binary Tree:\n";
79     PreOrderNew(root);
80     cout<<endl;
81     return 0;
82 }

运行结果:

 

posted @ 2015-07-27 22:16  vpoet  阅读(356)  评论(0编辑  收藏  举报