有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,


有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。




/*

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/


class TreePrinter {
public:
    vector<vector<int> > printTree(TreeNode* root) {
        // write code here
        vector<vector<int>> result;
        if(root==NULL) return result;
        queue<TreeNode*> q;
        q.push(root);
        TreeNode* last;
        TreeNode* nlast;
last=root;
        vector<int> tmp;
        while(!q.empty())
            {
                TreeNode *t=q.front();
                tmp.push_back(t->val);
              q.pop();
            
            if(t->left)
                    {
                    nlast=t->left;                  
                    q.push(t->left);
                }
            if(t->right)
                    {
                    nlast=t->right;
                    q.push(t->right);
                }
                if(t==last)
                    {
                    result.push_back(tmp);
                    tmp.clear();
                    last=nlast;
                }
        }
        return result;
    }
};
### 回答1: 算法如下: 1. 如果二叉树为空,则叶子结点数目为0,返回0。 2. 如果二叉树非空,则分别计算左子树和右子树中叶子结点的数目。 3. 如果当前结点的左子树和右子树都为空,则当前结点为叶子结点,叶子结点数目加1。 4. 最后返回左子树中叶子结点数目加上右子树中叶子结点数目加上当前结点是否为叶子结点的结果。 代码如下: ``` int countLeafNodes(TreeNode* root) { if (root == NULL) { return 0; } int leftCount = countLeafNodes(root->left); int rightCount = countLeafNodes(root->right); if (root->left == NULL && root->right == NULL) { return leftCount + rightCount + 1; } else { return leftCount + rightCount; } } ``` ### 回答2: 二叉树是一种重要的数据结构,在计算机科学中具有广泛的应用。叶子结点是指没有子节点的节点。计算一棵二叉树中叶子结点的数目是一个常见的问题。本文将介绍如何设计一个算法计算一棵给定二叉树中叶子结点的数目。 首先,我们需要了解二叉树的链式存储结构。在链式存储结构中,每个节点包含两个指针,一个指向左子节点,另一个指向右子节点。如果一个节点没有子节点,那么它就是叶子节点。 算法的实现过程如下: 1.如果二叉树为空,则返回0。 2.如果当前节点没有子节点,则返回1。 3.如果当前节点有左子节点和右子节点,则计算左子树和右子树中叶子结点的数目,并将它们相加。 4.返回计算结果。 算法分为递归版和非递归版,下面分别简要介绍。 递归版: ``` int countLeaves(TreeNode *root) { if (root == nullptr) return 0; if (root->left == nullptr && root->right == nullptr) return 1; return countLeaves(root->left) + countLeaves(root->right); } ``` 非递归版: ``` int countLeaves(TreeNode *root) { if (root == nullptr) return 0; int count = 0; stack<TreeNode *> s; s.push(root); while (!s.empty()) { TreeNode *node = s.top(); s.pop(); if (node->left == nullptr && node->right == nullptr) count++; if (node->left != nullptr) s.push(node->left); if (node->right != nullptr) s.push(node->right); } return count; } ``` 非递归版的算法采用了栈来保存遍历过的节点,因此不需要递归调用,效率更高。 综上所述,计算一棵给定二叉树中叶子结点的数目是一道比较简单的算法题。可以采用递归或者非递归方式来实现,在实际开发中应该据具体情况选择合适的算法。 ### 回答3: 二叉树是一种常见的数据结构,在树的节点中,有两个指针分别指向该节点的左子树和右子树。在二叉树的节点中,有三种类型的节点:节点、中间节点和叶子节点。叶子节点指的是没有子节点的节点,也就是说它们是二叉树的最底层节点。 给定一个二叉树,我们要计算二叉树中叶子节点的数量。首先我们需要遍历整个二叉树。采用先序遍历、中序遍历或后序遍历方法都可以,因为对于每个节点,我们都只需要知道它是否是叶子节点。 如果该节点的左子树和右子树都为空,那么该节点就是叶子节点,我们将叶子节点数量加1。如果左子树不为空,就继续遍历左子树。如果右子树不为空,就继续遍历右子树。当遍历完整个二叉树时,叶子节点的数量就是累加器中的数值。 我们可以采用递归来实现以上算法,递归函数的参数为当前节点的指针及叶子节点数量的累加器。递归函数流程如下: 1. 如果当前节点为空,直接返回 2. 如果当前节点的左子树和右子树都为空,说明该节点是叶子节点,将叶子节点数量加1 3. 如果当前节点的左子树不为空,递归遍历左子树 4. 如果当前节点的右子树不为空,递归遍历右子树 5. 返回叶子节点数量 代码实现如下: ``` int count_leaf_node(node* p, int& count) { if (!p) return 0; // 如果当前节点为空,直接返回 if (!p->left && !p->right) count++; // 如果当前节点是叶子节点,将叶子节点数量加1 count_leaf_node(p->left, count); // 递归遍历左子树 count_leaf_node(p->right, count); // 递归遍历右子树 return count; // 返回叶子节点数量 } ``` 调用该函数时,第一个参数为二叉树节点,第二个参数为叶子节点数量的累加器: ``` int count = 0; count_leaf_node(root, count); ``` 以上算法的时间复杂度是O(n),其中n是二叉树中节点的数量。空间复杂度是O(h),其中h是二叉树的高度,因为递归的深度不会超过二叉树的高度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值