114. 二叉树展开为链表-前序遍历
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了114. 二叉树展开为链表-前序遍历相关的知识,希望对你有一定的参考价值。
一、题目描述
给你二叉树的根结点 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.
* public class TreeNode
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode()
* TreeNode(int val) this.val = val;
* TreeNode(int val, TreeNode left, TreeNode right)
* this.val = val;
* this.left = left;
* this.right = right;
*
*
*/
class Solution
List<TreeNode> queue = new ArrayList<>();
public void flatten(TreeNode root)
//将先序遍历链表,然后将其存放在链表中,然后重新构造
if(root == null)
return ;
preorder(root);
int length = queue.size();
TreeNode cur = queue.get(0);
for(int i = 1;i<length;i++)
cur.left = null;
cur.right = queue.get(i);
cur = cur.right;
public void preorder(TreeNode root)
if(root == null)
return ;
queue.add(root);
preorder(root.left);
preorder(root.right);
时间复杂度:O(n);
空间复杂度:O(n)。
寻找前驱节点
对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。
class Solution
public void flatten(TreeNode root)
TreeNode curr = root;
while (curr != null)
if (curr.left != null)
TreeNode next = curr.left;
TreeNode predecessor = next;
while (predecessor.right != null)
predecessor = predecessor.right;
predecessor.right = curr.right;
curr.left = null;
curr.right = next;
curr = curr.right;
以上是关于114. 二叉树展开为链表-前序遍历的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode114 二叉树展开为链表 ---二叉树题 三种解法 (递归) (迭代) (前驱节点)