Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,3,2]
.
题意是对二叉树进行中序遍历,所以一般都会有两种做法,一种是递归,一种是非递归。所以递归做法如下:
Code:(LeetCode运行0ms)
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> s;
inorderTraversal(root, s);
return s;
}
void inorderTraversal(TreeNode *root, vector<int> &s) {
if (root) {
inorderTraversal(root -> left, s);
s.push_back(root -> val);
inorderTraversal(root -> right, s);
}
}
};
其中中序和前序、后序的递归版本,只有s.push_back(root -> val);这一步位置不一样,前序则是先进行这一步,然后再递归左子树和右子树。中序则在先递归完左子树,再进行这一步。
非递归版本:Code:(LeetCode运行0ms)
/**
* 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) {
stack<TreeNode *> s;
vector<int> visit;
//s.push(NULL);
TreeNode *pointer = root;
while (pointer || !s.empty()) {
if (pointer != NULL) {
s.push(pointer);
pointer = pointer -> left;
} else {
pointer = s.top();
s.pop();
visit.push_back(pointer -> val);
pointer = pointer -> right;
}
}
return visit;
}
};
因为做Recover Binary Tree的时候需要用到空间复杂度为O(1)的算法,所以特意返回来重写一遍中序遍历的非递归的另一种遍历——Morris遍历,代码如下:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
TreeNode *cur = root;
while (cur != NULL) {
if (!cur -> left) {
result.push_back(cur -> val);
//pre = cur;
cur = cur -> right;
} else {
TreeNode *node = cur -> left;
while (node -> right != NULL && node -> right != cur) {
node = node -> right;
}
if (node -> right == NULL) { //没有线索化,也就是还没访问过
node -> right = cur;
cur = cur -> left;
} else { //已经线索化,则可以访问中序结点,然后返回前驱,然后删除线索
result.push_back(cur -> val);
node -> right = NULL;
cur = cur -> right;
}
}
}
return result;
}