📜  数据结构|树遍历|问题11(1)

📅  最后修改于: 2023-12-03 14:54:56.840000             🧑  作者: Mango

数据结构 | 树遍历 | 问题11

树遍历是指按某种规定的遍历顺序依次访问树中每个结点,使得每个结点被访问一次且仅一次。在这个问题里,我们需要实现一个特殊的二叉树先序遍历,遍历时要按照从根结点开始,从左到右的顺序访问,同时忽略值为 0 的结点。例如,在下图所示的树中,应该得到序列 [1, 2, 4, 5, 3, 6, 7]。

tree1

解题思路

一般的二叉树先序遍历的递归实现很简单,但是在这个问题里,我们需要考虑忽略值为 0 的结点。因此,我们需要在递归时判断当前结点是否为 0,如果是则跳过该结点。具体来说,我们可以设计一个递归函数 $traverse(root)$,其中 $root$ 表示当前结点,函数的作用是在忽略值为 0 的结点情况下,按要求遍历当前子树。

具体的实现细节如下:

  • 如果当前结点不存在,直接返回;
  • 如果当前结点的值为 0,跳过该结点并递归遍历其右子树;
  • 否则,先输出当前结点的值,再分别递归遍历其左子树和右子树。

最后,我们将递归调用 $traverse(root)$ 得到的序列作为遍历结果返回即可。

参考代码
# Python 代码

def traverse(root):
    if not root:
        return []
    if root.val == 0:
        return traverse(root.right)
    return [root.val] + traverse(root.left) + traverse(root.right)

# 以下是一些函数调用的示例
tree = TreeNode(1)
tree.left, tree.right = TreeNode(2), TreeNode(3)
tree.left.left, tree.left.right, tree.right.right = TreeNode(4), TreeNode(5), TreeNode(7)
tree.left.left.left, tree.left.left.right, tree.left.right.left = TreeNode(0), TreeNode(0), TreeNode(6)
print(traverse(tree)) # 输出 [1, 2, 4, 5, 3, 6, 7]
// C++ 代码

vector<int> traverse(TreeNode* root) {
    if (!root) {
        return {};
    }
    if (root->val == 0) {
        return traverse(root->right);
    }
    vector<int> res = { root->val };
    auto left_traversal = traverse(root->left), right_traversal = traverse(root->right);
    res.insert(res.end(), left_traversal.begin(), left_traversal.end());
    res.insert(res.end(), right_traversal.begin(), right_traversal.end());
    return res;
}

// 以下是一些函数调用的示例
TreeNode* tree = new TreeNode(1, new TreeNode(2, new TreeNode(0), new TreeNode(0)), new TreeNode(3, new TreeNode(0), new TreeNode(7)));
vector<int> res = traverse(tree); // res 等于 { 1, 2, 0, 0, 3, 7 }
delete tree;