写在前面
看了三四天的书加上博客以及各种视频,最后还是写出来三种遍历的递归和非递归实现!其实很多时候并不是难,只要肯花时间和多敲代码,就可以很好地理解书上的原理,有的时候敲代码比看书更有效.
实现代码
#include <bits/stdc++.h>
using namespace std;
typedef struct Node
{
int data;
Node* left;
Node* right;
} Node;
typedef struct Tree
{
Node* root;
} Tree;
void Insert(Tree* tree,int value)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data=value;
node->left=NULL;
node->right=NULL;
if(tree->root==NULL)
tree->root=node;
else
{
Node* temp = tree->root;
while(temp!=NULL)
{
if(value>temp->data)
{
if(temp->right==NULL)
{
temp->right=node;
return;
}
else
temp=temp->right;
}
else
{
if(temp->left==NULL)
{
temp->left=node;
return;
}
else
temp=temp->left;
}
}
}
}
void preorder(Node* node)
{
if(node!=NULL)
{
cout<<node->data<<" ";
preorder(node->left);
preorder(node->right);
}
}
void inorder(Node* node)
{
if(node!=NULL)
{
inorder(node->left);
cout<<node->data<<" ";
inorder(node->right);
}
}
void postorder(Node* node)
{
if(node!=NULL)
{
postorder(node->left);
postorder(node->right);
cout<<node->data<<" ";
}
}
void preorder_ver(Node* node)
{
if(node==NULL)
return;
stack<Node*> st;
Node* temp = node;
while(!st.empty() || temp!=NULL)
{
while(temp)
{
cout<<temp->data<<" ";
st.push(temp);
temp=temp->left;
}
if(!st.empty())
{
temp=st.top();
st.pop();
temp=temp->right;
}
}
}
void inorder_ver(Node* node)
{
if(node==NULL)
return;
stack<Node*>st;
Node* temp = node;
while(!st.empty() || temp!=NULL)
{
while(temp)
{
st.push(temp);
temp=temp->left;
}
if(!st.empty())
{
temp=st.top();
cout<<temp->data<<" ";
st.pop();
temp=temp->right;
}
}
}
void postorder_ver(Node* node)
{
if(node==NULL)
return;
stack<Node*> st;
Node* temp = node;
Node* lastVisit=node;
while(!st.empty() || temp!=NULL)
{
while(temp)
{
st.push(temp);
temp=temp->left;
}
//查看当前栈顶元素
temp=st.top();
if(temp->right==NULL || temp->right==lastVisit)
{
cout<<temp->data<<" ";
st.pop();
lastVisit=temp;
temp=NULL;
}
else
temp=temp->right;
}
}
int main()
{
int arr[8] = {23, 45, 12, 6, 7, 89, 13, 47};
Tree tree;
tree.root=NULL;
for(int i=0; i<8; i++)
{
Insert(&tree,arr[i]);
}
preorder(tree.root);
cout<<endl;
preorder_ver(tree.root);
cout<<endl<<endl;
inorder(tree.root);
cout<<endl;
inorder_ver(tree.root);
cout<<endl<<endl;
postorder(tree.root);
cout<<endl;
postorder_ver(tree.root);
cout<<endl;
return 0;
}
测试样例截图
小收获
前序/后序+中序可以唯一确定一颗二叉树