📅  最后修改于: 2023-12-03 14:54:56.840000             🧑  作者: Mango
树遍历是指按某种规定的遍历顺序依次访问树中每个结点,使得每个结点被访问一次且仅一次。在这个问题里,我们需要实现一个特殊的二叉树先序遍历,遍历时要按照从根结点开始,从左到右的顺序访问,同时忽略值为 0 的结点。例如,在下图所示的树中,应该得到序列 [1, 2, 4, 5, 3, 6, 7]。
一般的二叉树先序遍历的递归实现很简单,但是在这个问题里,我们需要考虑忽略值为 0 的结点。因此,我们需要在递归时判断当前结点是否为 0,如果是则跳过该结点。具体来说,我们可以设计一个递归函数 $traverse(root)$,其中 $root$ 表示当前结点,函数的作用是在忽略值为 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;