节点定义如下:
typedef struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
}TreeNode;
先序递归遍历:
void PreOrder(TreeNode *p)
{
if (p != NULL)
{
cout << p->val << " ";
PreOrder(p->left);
PreOrder(p->right);
}
}
先序循环遍历:
void NicePreOrder(TreeNode *p)
{
if (p == NULL) return;
stack<TreeNode *> st;
st.push(p);
while (!st.empty())
{
p = st.top();
st.pop();
cout << p->val << " ";
if (p->right != NULL)
st.push(p->right);
if (p->left != NULL)
st.push(p->left);
cout << endl;
}
}
中序递归遍历:
void InOrder(TreeNode *p)
{
if (p != NULL)
{
InOrder(p->left);
cout << p->val << " ";
InOrder(p->right);
}
}
中序循环遍历:
void NiceInOrder(TreeNode *ptr)
{
if (NULL == ptr) return;
stack<TreeNode*> st;
while (!st.empty() || ptr != NULL)
{
while (ptr != NULL)//左边全部入栈
{
st.push(ptr);
ptr = ptr->left;
}
ptr = st.top();
st.pop();
cout << ptr->val << " ";
ptr = ptr->right;
}
cout << endl;
}
后序递归遍历:
void PastOrder(TreeNode *p)
{
if (p != NULL)
{
PastOrder(p->left);
PastOrder(p->right);
cout << p->val << " ";
}
}
后序循环遍历:
void NicePastOrder(TreeNode *ptr)
{
if (NULL == ptr) return;
stack<TreeNode*> st;
//保存上一次输出的节点
TreeNode *tag = NULL;
while (ptr != NULL || !st.empty())
{
while (ptr != NULL)
{
st.push(ptr);
ptr = ptr->left;
}
ptr = st.top();
st.pop();
//右边没有或者已经读过了,才能读此节点
if (ptr->right == NULL || ptr->right == tag)
{
cout << ptr->val << " ";
tag = ptr;
ptr = NULL;
}
else
{
st.push(ptr);
ptr = ptr->right;
}
}
}