首页 > 其他分享 >二叉树展开为链表(先序遍历)

二叉树展开为链表(先序遍历)

时间:2024-12-25 10:53:47浏览次数:6  
标签:right TreeNode int nullptr 链表 二叉树 left root 先序

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

 

示例 1:

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [0]
输出:[0]

思路一:先序遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> node; 
    void preOrder(TreeNode* root){
        if(root){
            //先序遍历
            node.emplace_back(root);
            preOrder(root->left);
            preOrder(root->right);
        }
    }
    void flatten(TreeNode* root) {
        if(root==nullptr) return;
        preOrder(root);
        //更改指针
        int n = node.size();
        for(int i=0;i<n;i++){
            node[i]->left = nullptr;
            if(i==n-1){
                node[i]->right = nullptr;
            }else{
                node[i]->right = node[i+1];
            }
        }
    }
};

思路二:反先序遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pre=nullptr; //前驱节点初始为null,要赋给最右的节点的右子树
    void flatten(TreeNode* root) {
        if(root==nullptr) return;
        //反先序遍历
        flatten(root->right);
        flatten(root->left);
        root->left=nullptr;
        root->right=pre;
        //更新前驱节点
        pre=root;
    }
};

 

标签:right,TreeNode,int,nullptr,链表,二叉树,left,root,先序
From: https://www.cnblogs.com/yueshengd/p/18629874

相关文章

  • 二叉树的右视图(层次遍历)
    给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入:root=[1,2,3,null,5,null,4]输出:[1,3,4]解释:示例2:输入:root=[1,2,3,4,null,null,null,5]输出:[1,3,4,5]解释:示例3:输入:root=[1,null,3......
  • LeetCode94二叉树的中序遍历
    原理二叉树的中序遍历遵循“左子树-根节点-右子树”的顺序来访问二叉树中的每个节点。其基本原理是利用递归的思想,先递归地遍历根节点的左子树,访问完左子树的所有节点后,再访问根节点本身,最后递归地遍历根节点的右子树,这样就能按照中序遍历的规则依次访问二叉树中的所有......
  • 二叉树的层序遍历(队列)
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。 示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[] /***Definitionforabinarytreen......
  • 二叉树的直径(递归)
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。 示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • 每日一算法----设计链表(java)
    classMyLinkedList{staticclassListNode{intval;intindex;ListNodeprev;ListNodenext;publicListNode(intval,intindex,ListNodeprev,ListNodenext){this.val=val;this.in......
  • 复杂链表的复制
       题意:需要对链表进行深拷贝,要同时拷贝链表节点的val、next指针和random指针题解一:逐个拷贝每个链表节点到当前节点的后面,分三次遍历,每次遍历走两步,最后达到深拷贝的目的1、第一次遍历原链表,逐个拷贝当前节点的值和next执行,(1->2->3变成1->1'->2->2'->3->3')2、第二次遍历......
  • LeetCode:222.完全二叉树节点的数量
    跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!代码随想录LeetCode:222.完全二叉树节点的数量给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节......
  • 第六章 二叉树part 01
    又是一种神奇的数据结构,可以让数据查询效率以指数级递减首先需要理解并掌握的是二叉树的遍历,遍历还分为两种,一种是递归遍历,代码简单到令人发指;另一种是迭代(是不是就是递推)今天只能先开个头,明天再补齐二叉树的递归遍历structTreeNode{intval;TreeNode*left;......
  • 【LeetCode】LCR 175.计算二叉树的深度
    题目链接:LCR175.计算二叉树的深度题目描述:思路一(深度优先搜索):使用深度优先搜索算法进行二叉树后序遍历复杂度分析:时间复杂度O(N):N为树的节点数量,计算树的深度需要遍历所有节点空间复杂度O(N):最差情况下(当树退化为链表时),递归深度可达到N/***Definitionfor......
  • 算法刷题Day7_翻转链表
    算法刷题Day7_单链表相关操作文章目录算法刷题Day7_单链表相关操作前言一、反转链表二、两两交换链表中的节点1.递归法2.迭代法总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、反转链表classSolution{public:ListNode*reverseList(ListNode......