Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3}
,1 \ 2 / 3return
[1,3,2]
.Note: Recursive solution is trivial, could you do it iteratively?
confused what
"{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.OJ’s Binary Tree Serialization:The serialization of a binary tree follows a level order traversal, where ‘#’ signifies a path terminator where no node exists below.Here’s an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; stack<TreeNode *> s; TreeNode * curr = root; while(curr || !s.empty()){ while(curr){ s.push(curr); curr = curr->left; } curr = s.top(); s.pop(); ans.push_back(curr->val); curr = curr->right; } return ans; } };
用循环代替递归,必然引进一个栈来模拟递归调用时存储的相关信息。
这里我用node的子节点是否全为空来标记该节点是否被已经被访问过– 第一次访问时按照-右节点-当前节点-左节点的顺序把节点压入栈中。并把当前节点的左右节点置空。
这样,程序便按照左节点-当前节点-右节点的顺序遍历了整个树结构,也即inorder traversal。
注意,该方法会修改原树的结构。
版本一:改变树的结构
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: stack<TreeNode *> s; vector<int> inorderTraversal(TreeNode *root) { vector<int> re; if(root == NULL){ return re; } s.push(root); while(!s.empty()){ TreeNode * p = s.top(); s.pop(); if(p->right != NULL){ s.push(p->right); } if(p->right == NULL && p->left == NULL){ re.push_back(p->val); } else{ s.push(p); } if(p->left != NULL){ s.push(p->left); } p->right = p->left = NULL; // WARNING: this will change the structure of original tree } return re; } };
版本二:不改变树的结构
我们换一个角度来考虑inorder traversal的顺序:
1. 给定一个节点p,如果该节点有左节点,则把该节点压入栈中,移动p至左节点,重复此操作;
2. 此时,p没有左节点,把p的val压入结果数组中。
3. 如果p的右节点为空,则栈顶元素出栈,赋给p,把p的val压入结果数组。重复步骤3
4. 如果p的右节点非空,p=p->right,跳至步骤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: stack<TreeNode *> s; vector<int> inorderTraversal(TreeNode *root) { vector<int> re; if(root == NULL){ return re; } TreeNode * p = root; while(p != NULL || !s.empty()){ if(p != NULL){ while(p->left != NULL){ s.push(p); p = p->left; } re.push_back(p->val); p = p->right; } else{//p is NULL p = s.top(); s.pop(); re.push_back(p->val); p = p->right; } } return re; } };