微软等数据结构+算法面试100题(41)-- 二叉树的前序遍历

来源:互联网 发布:商品分类页面设计源码 编辑:程序博客网 时间:2024/06/11 06:59

二叉树的前序遍历

/*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);}