二叉树的前序遍历
/*
43.递归和非递归俩种方法实现二叉树的前序遍历。
*/
void PreOrderTraverse(TreeNode *root)
{
if(root==NULL)
return;
cout<<root->data<<" ";
PreOrderTraverse(root->left);
PreOrderTraverse(root->right);
}
/*
树的前序遍历属于深度优先搜索。层序遍历属于广度优先搜索。
深度优先要用到栈,广度优先要用到队列。
广度优先已经在前面写过了。前序遍历是先遍历root的节点。
然后遍历左子树,左子树遍历完再遍历右子树。
例如:
10
/ \
6 14
/ \ / \
4 8 12 16
这样一棵树。遍历的时候由于是先遍历根节点再遍历左子树。所以只要root不为空的时候,我们就向左走。
例如先遍历10,10遍历完,遍历10的左子树,遍历6,6遍历完遍历6的左子树4.继续遍历4的左子树时为空了。
这是要转回去遍历6的右子树。所以这里就要用到栈了。我们在遍历的时候,将遍历了的节点存入栈中。方便回头遍历。
*/
void PreOrderTraverseNoRecursion(TreeNode *root,stack<TreeNode*> &st)
{
//只有当栈为空和节点为空的时候遍历结束。
while(root!=NULL||!st.empty())
{
if(root!=NULL)//如果节点不为空的时候,访问这个节点。将节点压栈。然后再遍历这个节点的左子树
{
cout<<root->data<<" ";
st.push(root);
root=root->left;
}
else//如果节点为空了。那么找到上一个访问的节点。开始访问右子树。
{
root=st.top();
root=root->right;
st.pop();
}
}
cout<<endl;
}
void PreOrderTraverseNoRecursion(TreeNode *root)
{
stack<TreeNode*> st;
PreOrderTraverseNoRecursion(root,st);
}
void PreOrderTraverseNoRecursionTest()
{
TreeNode* root=NULL;
cout<<"make tree"<<endl;
MakeTree(root);
cout<<"the tree : ";
LevelOrderTraverse(root);
cout<<"the tree : "<<endl;
LevelOrderTraverse1(root);
cout<<"the tree : ";
PreOrderTraverseNoRecursion(root);
}