实现代码如下,带有详细注释:
#include <iostream>
#include <stack>
// 定义的树结构体
struct TreeNode{
int val;
TreeNode* leftTree;
TreeNode* rightTree;
};
/* 二叉树的先序遍历,递归方法 */
void preOrder(TreeNode* root)
{
if(root != nullptr)
{
cout << "the value is: " << root->val;
preOrder(root->leftTree);
preOrder(root->rightTree);
}
}
/* 二叉树的先序遍历,非递归实现,借助栈,回溯法 */
void preOrder(TreeNode* root)
{
if(root == nullptr) return;
stack<TreeNode*> st;
//先打印根节点值,再一直打印左子树,最后打印右子树
st.push(root);
while(!st.empty())
{//将每一个节点的左右子树压入栈中,同时移除根节点
TreeNode* pNode = st.top();
cout << "the value is: " << pNode->val << endl;
st.pop();
if(pNode->rightTree != nullptr)
{
st.push(pNode->rightTree);
}
if(pNode->leftTree != nullptr)
{
st.push(pNode->leftTree);
}
}
}
/* 二叉树的中序遍历,递归实现 */
void inOrder(TreeNode* root)
{
if(root == nullptr) return;
inOrder(root->leftTree);
cout << "the value is: " << root->val << endl;
inOrder(root->rightTree);
}
/* 二叉树的中序遍历,非递归实现 */
void inOrder(TreeNode* root)
{
if(root == nullptr) return;
stack<TreeNode*> st;
while(!st.empty() || root != nullptr)
{
if(root != nullptr)
{//找到最小左子树,并从上到下压入栈中
st.push(root);
root = root->leftTree;
}
else
{
root = st.top();
cout << "the value is: " << root->val << endl;
st.pop();
root = root->rightTree;
}
}
}
/* 二叉树的后序遍历,递归实现 */
void postOrder(TreeNode* root)
{
if(root == nullptr) return;
postOrder(root->leftTree);
postOrder(root->rightTree);
cout << "the value is: " << root->val << endl;
}
/* 二叉树的后序遍历,非递归实现 */
void postOrder(TreeNode* root)
{
if(root == nullptr) return;
stack<TreeNode*> st;
TreeNode* pNode = nullptr; //声明一个空的辅助指针
while(root!=nullptr || !st.empty())
{
if(root != nullptr)
{// 非空节点
s.push(root);
root = root->leftTree;
}
else
{// 空节点
root = st.top(); //取出栈顶节点赋值给root
if(root->rightTree && root->rightTree != pNode)
{//存在右子树,并且未访问过
root = root->rightTree; //取右子树根节点,入栈
st.push(root);
root = root->leftTree;
}
else
{//不存在右子树或者 已经访问完右子树
root = st.top(); //弹出栈顶指针并赋值给root
st.pop();
cout << "the value is: " << root->val << endl;
pNode = root; //记录最近访问的节点
root = nullptr; //将root指针置为空
}
}
}
}