C++ 输出单层结点

35 篇文章 0 订阅
#include<iostream>
using namespace std;

/**

对于一棵二叉树,请设计一个算法,
创建含有某一深度上所有结点的链表。

给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,
请返回一个链表ListNode,代表该深度上所有结点的值,
请按树上从左往右的顺序链接,
保证深度不超过树的高度,
树上结点的值为非负整数且不超过100000。

算法:对二叉树进行层序遍历,在同一层的所有节点将被取出
并取出对应节点的数值,创建新的链表节点对象,添加到链表中去

二叉树的深度:
二叉树的根节点深度为1

**/
#include<vector>

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

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class TreeLevel {
public:
    ListNode* getTreeLevel(TreeNode* root, int dep) {
        // write code here
        //根节点的深度为1
        ListNode* pHead=new ListNode(0);
        ListNode* p=pHead;
        if(dep==0){
            return pHead->next;
        }
        vector<TreeNode*> helper_queue;
        vector<int> helper_depth;
        // 最终helper_queue剩下的都是depth=dep的二叉树中的节点
        helper_queue.push_back(root);
        helper_depth.push_back(0);
        TreeNode *temp_node;
        int temp_depth;
        while(helper_queue.size()>0){
            if(helper_depth[0]==dep){
                break;
            }
            temp_node=helper_queue[0];
            temp_depth=helper_depth[0];
            helper_queue.erase(helper_queue.begin());
            helper_depth.erase(helper_depth.begin());
            if(temp_node->left!=NULL){
                helper_queue.push_back(temp_node->left);
                helper_depth.push_back(temp_depth+1);
            }
            if(temp_node->right!=NULL){
                helper_queue.push_back(temp_node->right);
                helper_depth.push_back(temp_depth+1);
            }
        }
        // 从辅助队列的队列头部(index=0)开始读取出树中的节点
        for(unsigned int i=0;i<helper_queue.size();i++){
            ListNode* new_node=new ListNode(helper_queue[i]->val);
            p->next=new_node;
            p=p->next;
        }
        return pHead->next;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值