BinaryTree

二叉树总结

1
2
3
4
5
6
struct TreeNode{
int value;
TreeNode *left;
TreeNode *right
TreeNode(int v): value(v),left(nullptr), right(nullptr) {}
};

遍历二叉树

前序遍历

  • 递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution{
public:
vector<int>preOrderTraversal(TreeNode* tree) {
vector<int> ans;
function<void(TreeNode *)> preOrderTraversalHelper = [&](TreeNode *node){
if (!node) return;
ans.push_back(node->val);
preOrderTraversalHelper(node->left);
preOrderTraversalHelper(node->right)
};
preOrderTraversalHelper(tree);
return ans;
}
};
  • 非递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution{
public:
vector<int>preOrderTraversal(TreeNode *node){
if (!node) return {};
vector<int> ans;
stack<TreeNode *> stk_;
stk_.push(node);
while (!stk_.empty()) {
TreeNode *root = stk_.top();
stk_.pop();
ans.(root->value);
if (root->right)
stk_.push(root->right);
if (root->left)
stk_.push(root->left);
}
return ans;
}push_back
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> nums;
TreeNode* cur = nullptr;

while (root) {
if (root->right) {
cur = root->right;
while (cur->left && cur->left != root) {
cur = cur->left;
}
if (cur->left == root) {
cur->left = nullptr;
root = root->left;
} else {
nums.push_back(root->val);
cur->left = root;
root = root->right;
}
} else {
nums.push_back(root->val);
root = root->left;
}
}
return nums;
}
}

中序遍历

  • 递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
vector<int> inOrderTraversal(TreeNode *node) {
vector<int> ans;
function<void(TreeNode *)> inOrderTraversalHelper = [&](TreeNode * root){
if (!root) return;
inOrderTraversalHelper(root->left)
ans.push_back(root->val);
inOrderTraversalHelper(root->right);
};
inOrderTraversalHelper(root);
return ans;
}
};
  • 非递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution{
public:
vector<int>inOrderTraversal(TreeNode *root){
if (!root) return {};
vector<int> ans;
stack<TreeNode *> stk_;
while (root || !stk_.empty()) {
while (root) {
stk_.push(root);
root = root->left;
}
root = stk_.top(); stk_.pop();
ans.push_back(root->value);
root = root->right;
}
return ans;
}
};

后序遍历

  • 递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
vector<int> postOrderTraversal(TreeNode *node) {
vector<int> ans;
function<void(TreeNode *)>postOrderTraversalHelper = [&](TreeNode *root){
if (!root) return;
postOrderTraversal(root->left);
postOrderTraversal(root->right);
ans.push_back(root);
};
postOrderTraversal(node);
return ans;
}
};
  • 非递归

    two stack

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Solution {
    public:
    vector<int> postOrderTraversal(TreeNode *root){
    if (!root) return {};
    stack<TreeNode *> stk_, _stk;
    stk_.push(root);
    TreeNode *node = nullptr;
    while (!stk_.empty()) {
    node = stk_.top();stk_.pop();
    _stk.push(node);
    if (node->left)
    stk_.push(node->left);
    if (node->right)
    stk_.push(node->right);
    }
    while (!_stk.empty()) {
    ans.push_back(_stk.top());
    _stk.pop();
    }
    }
    };

one stack, 需要记录上一个输出的节点的指针,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<int> postOrderTraversal(TreeNode *root) {
if (!root) return {};
vector<int> ans;
stack<TreeNode *>stk_;
TreeNode *last = nullptr;
while (root || !stk_.empty()) {
if (root) {
stk_.push(root);
root = root->left;
} else {
TreeNode *node = stk_.top();
if (node->right && last != node->right) {
root = node->right;
} else {
ans.push_back(node->value);
last = node;
stk_.pop();
}
}
}
return ans;
}
};

Morris Traversal O(n) time O(1) space

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> nodes;
TreeNode* dummy = new TreeNode(0);
dummy -> left = root;
TreeNode* cur = dummy;
while (cur) {
if (cur -> left) {
TreeNode* pre = cur -> left;
while (pre -> right && (pre -> right != cur)) {
pre = pre -> right;
}
if (!(pre -> right)) {
pre -> right = cur;
cur = cur -> left;
} else {
reverseAddNodes(cur -> left, pre, nodes);
pre -> right = NULL;
cur = cur -> right;
}
} else {
cur = cur -> right;
}
}
return nodes;
}
private:
void reverseNodes(TreeNode* start, TreeNode* end) {
if (start == end) {
return;
}
TreeNode* x = start;
TreeNode* y = start -> right;
TreeNode* z;
while (x != end) {
z = y -> right;
y -> right = x;
x = y;
y = z;
}
}
void reverseAddNodes(TreeNode* start, TreeNode* end, vector<int>& nodes) {
reverseNodes(start, end);
TreeNode* node = end;
while (true) {
nodes.push_back(node -> val);
if (node == start) {
break;
}
node = node -> right;
}
reverseNodes(end, start);
}
};
作者

shouyi.www

发布于

2020-06-29

更新于

2025-01-30

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×