树中,打印叶子结点,在这里有else和无else有什么区别吗?
没啥区别
有else就直接不递归了
无else会继续往下递归一次,但是遇到null走出if,还是不继续递归了
最终实现的逻辑上完全等价的
有区别,右边死循环,内存会溢出,左边找到最底层后打印,相当于结束了此次查找
回答:
带有else和不带else的叶子节点打印函数的区别在于是否在遍历完所有子节点后添加了打印叶子节点的语句。
不带else的打印叶子节点函数:
void printLeaf(TreeNode* root) { if (root == NULL) return; if (root->left == NULL && root->right == NULL) cout << root->val << " "; printLeaf(root->left); printLeaf(root->right); }
这个函数没有else语句,意味着在有两个子节点的节点处,该函数不会继续打印叶子节点,而是先打印左子树的所有叶子节点再打印右子树的所有叶子节点,因此输出的顺序不一定是从左到右。
带有else的打印叶子节点函数:
void printLeaf(TreeNode* root) { if (root == NULL) return; if (root->left == NULL && root->right == NULL) cout << root->val << " "; else { printLeaf(root->left); printLeaf(root->right); } }
这个函数有else语句,意味着在遍历到有两个子节点的节点时,该函数会先进入左子树继续遍历,直到找到叶子节点才打印,再回到有两个子节点的节点处进入右子树继续遍历,直到找到所有叶子节点才打印。因此输出的顺序是从左到右。
以上两个函数的共同点是在遍历完整个树后都能打印出所有叶子节点。选择使用哪个函数取决于输出顺序的要求。
参考代码:
这里提供一个例子来演示打印二叉树叶子节点的方法,使用上面的第二个函数(带有else)来输出从左到右的顺序:
using namespace std;
struct TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
void printLeaf(TreeNode* root) { if (root == NULL) return; if (root->left == NULL && root->right == NULL) cout << root->val << " "; else { printLeaf(root->left); printLeaf(root->right); } }
int main() { // Construct a binary tree: [1, 2, 3, 4, 5, 6, 7] TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->right->left = new TreeNode(6); root->right->right = new TreeNode(7);
// Print the leaf nodes of the binary tree from left to right
printLeaf(root); // Output: 4 5 6 7
return 0;
}