您的位置:首页 > 其它

LeetCode Binary Tree Inorder Traversal

2012-10-27 21:48 399 查看
Given a binary tree, return the inorder traversal of its nodes' values.

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

非递归版本:

用一个栈来模拟递归的情况,

首先思考inorder traverse的递归函数

traverse(left tree);

visit current node

traverse(right tree);

也就是说我们把一个节点压入栈中,首先它会先递归访问左子树(左节点入栈),再访问本身(这个时候这个节点就可以出栈了),在访问右子树(右节点入栈)。

最后我们定义一个数据结构

struct Node
{
TreeNode *tNode;
bool findLeft;
Node(){}
Node(TreeNode *n):tNode(n), findLeft(false){}
};


其中findLeft是判断是否已将左节点入栈了

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct Node
{
TreeNode *tNode;
bool findLeft;
Node(){}
Node(TreeNode *n):tNode(n), findLeft(false){}
};

class Solution {
private:
vector<int> ret;
public:
vector<int> inorderTraversal(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
stack<Node> s;
s.push(Node(root, false));
ret.clear();

while(!s.empty())
{
Node node = s.top();
if (node.tNode == NULL)
s.pop();
else
{
if (!node.findLeft)
{
s.pop();
s.push(Node(node.tNode, true));
s.push(Node(node.tNode->left, false));
}
else
{
s.pop();
ret.push_back(node.tNode->val);
s.push(Node(node.tNode->right, false));
}
}
}

return ret;
}
};


递归版本:

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
stack<TreeNode* > s;
vector<int> ret;
public:
vector<int> inorderTraversal(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ret.clear();
if (root == NULL)
return ret;

s.push(root);
TreeNode *node = root;
while(!s.empty())
{
node = node->left;
s.push(node);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: