从上往下打印二叉树

文章目录


题目内容

尝试一

result:答案正确:恭喜!您提交的程序通过了所有的测试用例
code:

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    //二叉树的深度
    private int depth=0;
    private TreeNode root=null;
    private ArrayList<Integer> printList=new ArrayList<>();
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        /*重置二叉树深度和节点*/
        depth=0;
        this.root=root;
        printList=new ArrayList<>();

        //设置二叉树的深度
        setDepth(this.root);

        //打印二叉树
        for(int i=1;i<=depth;++i){
            print(i,1,this.root);
        }

        return printList;
    }

    /*寻找二叉树的深度(这是先序遍历)*/
    private void setDepth(TreeNode root){
        /*递归结束标识*/
        if(root==null){
            return ;
        }
        depth+=1;
        setDepth(root.left);
        setDepth(root.right);
    }

    /*
     *now:表示第k层的节点
     * i:标识打印第i层
     * k:表示递归到了第k层
     */
    private void print(int i,int k,TreeNode now){
        if(i>depth || now ==null){
            return;
        }
        if( k==i){//意思是递归到指定打印层i
            printList.add(now.val);
        }
        print(i,k+1,now.left);
        print(i,k+1,now.right);


    }
}

思路:需要找到二叉树的深度,然后一层一层的打印。至于怎么到达指定层,用递归的方法。

结论

  • 在递归时,有些参数不需要你写在递归函数的形参里面。那它定义为实例对象反而会是代码更清晰。
### C语言实现从上到下打印二叉树 要实现从上到下的顺序打印二叉树节点,可以采用层次遍历的方法。这种方法通常借助队列来完成,因为队列具有先进先出的特点,能够按照加入的顺序依次处理每个节点。 以下是完整的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int data; struct TreeNode* lchild; struct TreeNode* rchild; } TreeNode; // 创建新节点 TreeNode* create_node(int value) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = value; node->lchild = NULL; node->rchild = NULL; return node; } // 层次遍历打印二叉树 void level_order_traversal(TreeNode* root) { if (!root) return; // 如果根为空,则直接返回 // 初始化队列 TreeNode** queue = (TreeNode**)malloc(100 * sizeof(TreeNode*)); // 假设最多有100个节点 int front = 0, rear = 0; // 将根节点入队 queue[rear++] = root; while (front != rear) { // 当队列不为空时继续循环 TreeNode* current = queue[front++]; // 取出队首元素 printf("%d ", current->data); // 输出当前节点的数据 // 左子节点存在则将其入队 if (current->lchild) { queue[rear++] = current->lchild; } // 右子节点存在则将其入队 if (current->rchild) { queue[rear++] = current->rchild; } } free(queue); // 释放队列内存 } int main() { // 构建一个简单的二叉树作为测试数据 TreeNode* root = create_node(1); root->lchild = create_node(2); root->rchild = create_node(3); root->lchild->lchild = create_node(4); root->lchild->rchild = create_node(5); // 调用层次遍历函数 printf("Level order traversal of binary tree is:\n"); level_order_traversal(root); return 0; } ``` 上述代码实现了通过队列进行层次遍历的功能[^1]。具体来说,程序会逐层访问二叉树中的每一个节点,并按从左至右的顺序输出其值。如果某个节点还有子节点,则这些子节点会被添加到队列中等待后续处理。 #### 关键点说明: - **队列的作用**:用于存储待访问的节点,确保每次总是优先访问较早进入队列的节点。 - **边界条件**:当输入的二叉树为空时,应立即退出而不执行任何操作。 - **动态分配与释放资源**:为了支持不同大小的二叉树,在实际应用中可能需要更灵活地管理队列的空间大小以及及时释放不再使用的内存区域。 此方法的时间复杂度为O(n),其中n表示二叉树中总的节点数;空间复杂度同样也是O(n),因为在最坏情况下整个二叉树的所有节点都可能会被暂时存放在队列里[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值