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

二叉树的前序遍历

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值