LeetCode --- Binary Tree Postorder Traversal

LeetCode---Binary Tree Postorder Traversal

后序遍历二叉树:

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

先说递归遍历:
void PostOrderTraverse(BiTree *root)
{
if(!root )
{
    return;
       }
        PostOrderTraverse(root->lchild);
PostOrderTraverse(root->rchild);
        cout<<root->data<<endl;
}

递归的好处就是代码看着简洁清楚,但是理解和调试什么的都很费劲。而且由于频繁的入栈出栈,时间效率也不高。

本题中的非递归遍历
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
		vector<int>output;
		vector<TreeNode*>storage;
		output.clear();
		storage.clear();
		if (root == NULL)
		{
			return output;
		}

		storage.push_back(root);
		TreeNode* temp = NULL;
		while (storage.size() > 0)
		{
			temp = storage.back();
			if (temp->left == NULL && temp->right == NULL)
			{
				output.push_back(temp->val);
				storage.pop_back();
			}
			else
			{
				if (temp->right)
				{
					storage.push_back(temp->right);
					temp->right = NULL;
				}
				if (temp->left)
				{
					storage.push_back(temp->left);
					temp->left = NULL;
				}
			}
		}
		return output;
    }
};

主要有以下几点:
(1)如果树为空直接输出。
(2)将根节点放入到临时存储的栈中,此处用了Vector,效果一样。
(3)获取栈顶元素,判断该节点的左右孩子,如果都为空,则将该节点放入到结果栈,然后将该节点出栈。
(4)如果该节点的右孩子不为空,则将该节点的右孩子入栈,同时将该节点的右孩子指针置为空。
(5)然后判断该节点的左孩子不为空,则将该节点的左孩子入栈,同时将该节点的左孩子置为空。
(6)处理完所有节点,临时存储栈为空,输出结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值