LeetCode:Binary Tree Preorder Traversal
2013-11-10 17:02
204 查看
题目:非递归实现二叉树的前序遍历。题目链接
算法1:使用栈的非递归遍历。先用根节点初始化栈,然后循环如下操作:访问栈顶节点,先后把栈顶节点右节点和左节点压栈(次序不能反,先右节点,后左节点),代码如下:
算法2:不使用栈的非递归前序遍历(Morris Traversal算法),只要在Morris Traversal中序遍历的算法基础上修改代码节点访问顺序即可,步骤如下,代码中红色部分是修改的
重复以下1、2直到当前节点为空。
1. 如果当前节点的左孩子为空,则输出当前节点并将其右孩子作为当前节点。
2. 如果当前节点的左孩子不为空,在当前节点的左子树中找到当前节点在中序遍历下的前驱节点(即当前节点的左子树的最右节点)。
a) 输出当前节点。(相对中序遍历,输出位置改变了)。如果前驱节点的右孩子为空,将它的右孩子设置为当前节点(利用这个空的右孩子指向它的后缀)。当前节点更新为当前节点的左孩子。
b) 如果前驱节点的右孩子为当前节点,将它的右孩子重新设为空(恢复树的形状)。当前节点更新为当前节点的右孩子。
【版权声明】转载请注明出处:/article/4879631.html
算法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
相关文章推荐
- leetcode题解-105 && 106. Construct Binary Tree from Preorder (PostOrder) and Inorder Traversal
- LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
- [LeetCode 144] Binary Tree Preorder Traversal
- LeetCode-Construct Binary Tree from Preorder and Inorder Traversal
- [leetcode] Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
- [leetcode]Binary Tree Preorder Traversal
- 个人记录-LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
- leetcode-144-Binary Tree Preorder Traversal
- Leetcode 树 Binary Tree Preorder Traversal
- 【leetcode 先序遍历】Binary Tree Preorder Traversal
- LeetCode Binary Tree Preorder Traversal
- LeetCode 105, 106. Construct Binary Tree from Preorder and Inorder/Inorder and Postorder Traversal
- LeetCode:Construct Binary Tree from Preorder and Inorder Traversal
- [leetcode] Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode Construct Binary Tree from Preorder and Inorder Traversal
- Binary Tree Preorder Traversal -- leetcode
- leetcode || 105、Construct Binary Tree from Preorder and Inorder Traversal
- [leetcode] Binary Tree Preorder Traversal
- [LeetCode]Construct Binary Tree from Preorder and Inorder Traversal