面试常见知识点--树的遍历

一、前序遍历

算法流程:

1.先申请一个栈,记为stk

2.然后将根节点压入stk中。

3.每次从stk中弹出栈顶节点,记为cur,然后打印cur的值。如果cur的右子树不为空,将cur的右子树压入stk中。如果cur的左子树不为空,将cur的左子树压入stk中。不断重复次步骤直到stk为空循环结束。

void Tree::Preorder(Node* root) {
	stack<Node*>stk;
	stk.push(root);
	cout << "前序遍历" << endl;
	while (!stk.empty()) {
		Node* cur = stk.top();
		cout << cur->val << " ";
		stk.pop();
		if (cur->right) {
			stk.push(cur->right);
		}
		if (cur->left) {
			stk.push(cur->left);
		}
	}
}

二、中序遍历

1.申请一个栈记为stk,申请一个变量curcur被根节点初始化。

2.把cur节点压入栈中,对以cur节点为根节点的整棵子树,依次把整棵树的左边界压入到栈中,即不断的执stk.push(cur) ; cur = cur->left;直到cur为空停止本次循环。

3.上面循环停止后,弹出栈顶节点,记录为node,打印node,并且让cur=node->right;然后继续重复步骤2

4.直到stk为空并且cur也为空时,停止整个循环。

void Tree::Inorder(Node* root) {
	Node* cur = root;
	stack<Node*>stk;
	cout << endl;
	cout << "中序遍历"<<endl;
	while (cur||!stk.empty()) {
		while(cur){
			stk.push(cur);
			cur = cur->left;
		}
		Node* Node = stk.top();
		stk.pop();
		cout << Node->val << " ";
		cur = Node->right;
	}

三、后序遍历

1.申请两个栈,记为S1S2,然后将头结点压入S1中。

2.s1中弹出的节点记为cur;然后先把cur的左子树压入到s1中,然后把cur的右子树压入到s1中。每一个从S1中弹出的节点都放进S2中。

3.不断重复步骤2,直到S1为空,整个过程结束。

void Tree::Postorder(Node* root) {
	stack<Node*>S1;
	stack<Node*>S2;;
	S1.push(root);
	cout << endl;
	cout << "后序遍历" << endl;
	while (!S1.empty()) {
		Node* cur = S1.top();
		S2.push(cur);
		S1.pop();
		if (cur->left) {
			S1.push(cur->left);
		}
		if (cur->right) {
			S1.push(cur->right);
		}		
		}
	    while (!S2.empty()) {
        cout << S2.top()->val << " ";
	S2.pop();	
	}
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值