LeeCode刷题,链表和二叉树转换工具

本文介绍了如何在C++中使用初始化列表初始化List和构建二叉树。提供了List节点和二叉树节点的定义,以及递归构建二叉树的方法。此外,还包含了非递归实现的二叉树前、中、后序遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

给大家提供一下,力扣刷题的时候,在本地 IDE 测试时,链表和二叉树的数组初始化工具。


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用初始化列表初始 List

initializer_list 记得包含这个头文件

#include <initializer_list>
struct ListNode
{
    int val;
    ListNode* next;

    ListNode(int val) : val(val), next(nullptr) {}

    ListNode(std::initializer_list<int> lst) : ListNode(*lst.begin()){
        for(auto i = lst.end() - 1; i != lst.begin(); --i){
            ListNode* tmp = new ListNode(*i);
            tmp->next = this->next;
            this->next = tmp;
        }
    }
};

二、使用初始化列表初始 二叉树

struct TreeNode
{
    int val;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

Node* createTree_2(vector<int> &tmp,int n,int start){//使用了递归
    if (tmp[start] == '#') return NULL;//当根节点为空,即空树

    Node* root=new Node(tmp[start]);
   

    int lNode=2*start+1;
    int rNode=2*start+2;

    if(lNode>n-1) root->left = NULL;
    else root->left = createTree_2(tmp,n,lNode);
    if(rNode>n-1) root->right = NULL;
    else root->right = createTree_2(tmp,n,rNode);
    
    return root;
}

二叉树的前、中、后序遍历非递归实现

void pre(Node* bt){//根左右
    Node* T=bt;
    if(!T) return;
    stack<Node*> s;
    while (T || !s.empty())
    {
        while(T){
            cout<<T->val<<" ";//遍历左子树
            s.push(T->right);//把右子树压入栈中
            T=T->left;
        }
        if(!s.empty()){
            T=s.top();
            s.pop();
        }
    }
}

void mid(Node* bt){//左根右
    Node* T=bt;
    if(!T) return;
    stack<Node*> s;
    while (T || !s.empty())
    {
        while(T){
            s.push(T);//把左子树压入栈中
            T=T->left;
        }
        
        if(!s.empty())
        {
            T=s.top();
            s.pop();
            cout<<T->val<<" "; 
            T = T->right;
        }
    }
}

void post(Node* bt){//左右根
    Node* T=bt;
    if(!T) return;
    stack<Node*> s;
    Node* last=NULL;
    while (T || !s.empty()){
        while (T){
            s.push(T);
            T=T->left;
        }

        if(!s.empty()){
            T=s.top();
            if(!T->right || T->right == last){
                cout<<T->val<<" ";
                last=T;
                s.pop();
                T=NULL;
            }else{
                T = T->right;
            }
        }
    }
}

总结

冲力扣,二叉树创建有缺陷,更新了第二版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值