二叉树先序遍历的访问顺序是根、左、右,用递归可以很方便地写出先序遍历程序,但是有时面试官也会让我们以非递归的方式来实现。这里采用栈来实现非递归先序遍历。程序如下:
1.先序遍历递归方法
#include "stdafx.h"
#include<iostream>
#include <stack>
#include <vector>
using namespace std;
typedef struct binary_tree_node
{
struct binary_tree_node* left;
struct binary_tree_node* right;
int data;
}Binary_Tree_Node;
void visit(Binary_Tree_Node* pNode)
{
if (pNode!=NULL)
{
cout<<pNode->data<<" ";
}
}
Binary_Tree_Node* create_tree(vector<int> dataVec);
void insert_node(Binary_Tree_Node* root,int data);
void pre_order(Binary_Tree_Node* root);
void free_node(Binary_Tree_Node* root);
int _tmain(int argc, _TCHAR* argv[])
{
int tmpArray[]={1,2,3,4,5,6,7};
vector<int> input(tmpArray,tmpArray+7);
Binary_Tree_Node *root=create_tree(input);
pre_order(root);
free_node(root);
return 0;
}
Binary_Tree_Node* create_tree(vector<int> dataVec)
{
if (dataVec.size()==0)
{
return nullptr;
}
Binary_Tree_Node *root=new Binary_Tree_Node();
root->left=NULL;
root->right=NULL;
root->data=dataVec[0];
for (int i=1;i<dataVec.size();++i)
{
insert_node(root,dataVec[i]);
}
return root;
}
void insert_node(Binary_Tree_Node* root,int data)
{
if (root->left==NULL)
{
Binary_Tree_Node* leftChild=new Binary_Tree_Node();
leftChild->left=NULL;
leftChild->right=NULL;
leftChild->data=data;
root->left=leftChild;
return;
}
if (root->right==NULL)
{
Binary_Tree_Node* leftChild=new Binary_Tree_Node();
leftChild->left=NULL;
leftChild->right=NULL;
leftChild->data=data;
root->right=leftChild;
return;
}
insert_node(root->left,data);
}
void pre_order(Binary_Tree_Node* root)
{
if (root==NULL)
{
return;
}
visit(root);
if (root->left!=NULL)
{
pre_order(root->left);
}
if (root->right!=NULL)
{
pre_order(root->right);
}
}
void free_node(Binary_Tree_Node* root)
{
if (root->left!=NULL)
{
free_node(root->left);
}
if (root->right!=NULL)
{
free_node(root->right);
}
delete root;
root=NULL;
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">2.先序遍历非递归方法</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp">#include "stdafx.h"
#include<iostream>
#include <stack>
#include <vector>
using namespace std;
typedef struct binary_tree_node
{
struct binary_tree_node* left;
struct binary_tree_node* right;
int data;
}Binary_Tree_Node;
void visit(Binary_Tree_Node* pNode)
{
if (pNode!=NULL)
{
cout<<pNode->data<<" ";
}
}
Binary_Tree_Node* create_tree(vector<int> dataVec);
void insert_node(Binary_Tree_Node* root,int data);
void pre_order(Binary_Tree_Node* root);
void free_node(Binary_Tree_Node* root);
int _tmain(int argc, _TCHAR* argv[])
{
int tmpArray[]={1,2,3,4,5,6,7};
vector<int> input(tmpArray,tmpArray+7);
Binary_Tree_Node *root=create_tree(input);
pre_order(root);
free_node(root);
return 0;
}
Binary_Tree_Node* create_tree(vector<int> dataVec)
{
if (dataVec.size()==0)
{
return nullptr;
}
Binary_Tree_Node *root=new Binary_Tree_Node();
root->left=NULL;
root->right=NULL;
root->data=dataVec[0];
for (int i=1;i<dataVec.size();++i)
{
insert_node(root,dataVec[i]);
}
return root;
}
void insert_node(Binary_Tree_Node* root,int data)
{
if (root->left==NULL)
{
Binary_Tree_Node* leftChild=new Binary_Tree_Node();
leftChild->left=NULL;
leftChild->right=NULL;
leftChild->data=data;
root->left=leftChild;
return;
}
if (root->right==NULL)
{
Binary_Tree_Node* leftChild=new Binary_Tree_Node();
leftChild->left=NULL;
leftChild->right=NULL;
leftChild->data=data;
root->right=leftChild;
return;
}
insert_node(root->left,data);
}
void pre_order(Binary_Tree_Node* root)
{
if (root==NULL)
{
return;
}
stack<Binary_Tree_Node*> pStack;
pStack.push(root);
while(!pStack.empty())
{
Binary_Tree_Node *curNode=pStack.top();
pStack.pop();
visit(curNode);
if (curNode->right!=NULL)
{
pStack.push(curNode->right);
}
if (curNode->left!=NULL)
{
pStack.push(curNode->left);
}
}
}
void free_node(Binary_Tree_Node* root)
{
if (root->left!=NULL)
{
free_node(root->left);
}
if (root->right!=NULL)
{
free_node(root->right);
}
delete root;
root=NULL;
}
上述程序生成的二叉树如下图:
先序遍历结果如下: