您的位置:首页 > 其它

LeetCode:Binary Tree Preorder Traversal

2013-11-10 17:02 204 查看
题目:非递归实现二叉树的前序遍历。题目链接

算法1:使用栈的非递归遍历。先用根节点初始化栈,然后循环如下操作:访问栈顶节点,先后把栈顶节点右节点和左节点压栈(次序不能反,先右节点,后左节点),代码如下:

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<int>res;
if(root == NULL)return res;
stack<TreeNode *> nstack;
nstack.push(root);
while(nstack.empty() == false)
{
TreeNode *p = nstack.top();
res.push_back(p->val);
nstack.pop();
if(p->right)nstack.push(p->right);
if(p->left)nstack.push(p->left);
}
return res;
}
};


算法2:不使用栈的非递归前序遍历(Morris Traversal算法),只要在Morris Traversal中序遍历的算法基础上修改代码节点访问顺序即可,步骤如下,代码中红色部分是修改的

重复以下1、2直到当前节点为空。

1. 如果当前节点的左孩子为空,则输出当前节点并将其右孩子作为当前节点。

2. 如果当前节点的左孩子不为空,在当前节点的左子树中找到当前节点在中序遍历下的前驱节点(即当前节点的左子树的最右节点)。

a) 输出当前节点。(相对中序遍历,输出位置改变了)。如果前驱节点的右孩子为空,将它的右孩子设置为当前节点(利用这个空的右孩子指向它的后缀)。当前节点更新为当前节点的左孩子。

b) 如果前驱节点的右孩子为当前节点,将它的右孩子重新设为空(恢复树的形状)。当前节点更新为当前节点的右孩子。

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
TreeNode *current = root, *pre = NULL;
vector<int> res;
while(current != NULL)
{
if(current->left == NULL)
{
res.push_back(current->val);
current = current->right;
}
else
{
/* Find the inorder predecessor of current */
pre = current->left;
while(pre->right != NULL && pre->right != current)
pre = pre->right;

if(pre->right == NULL)
{     /* Make current as right child of its inorder predecessor */
pre->right = current;
res.push_back(current->val);
current = current->left;
}
else
{
/* Revert the changes made in if part to restore the original
tree i.e., fix the right child of predecssor */
pre->right = NULL;//中序是在这里输出
current = current->right;
}
}
}
return res;
}
};


【版权声明】转载请注明出处:/article/4879631.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: