`

Binary Tree的题目总结(三)

阅读更多
这篇文章主要列举数组或者链表如何转换为二叉树。

1,Convert Sorted Array to Binary Search Tree
将一个有序数组变为二叉平衡树。

因为数组有序,我们通过二分法,依次将数组元素变为数节点,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        TreeNode root = null;
        int l = 0;
	    int r = nums.length - 1;
    	if(l <= r) {
	    	int m = l + (r - l) / 2;
		    root = new TreeNode(nums[m]);
		    root.left = sortedArrayToBST(Arrays.copyOfRange(nums, l, m));
		    root.right = sortedArrayToBST(Arrays.copyOfRange(nums, m + 1, nums.length));
	    }
	    return root;
    }
}


2,Convert Sorted List to Binary Search Tree
将一个有序的链表转变为二叉平衡树。

用快慢指针,得到链表中间元素,过程和数组的类似。代码如下:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode sortedListToBST(ListNode head) {
       if(head == null) return null;
	ListNode fast = head;
	ListNode slow = head;
	ListNode pre = null;
	while(fast != null && fast.next != null && fast.next.next != null) {
			pre = slow;
			slow = slow.next;
			fast = fast.next.next;
	}
	TreeNode root = new TreeNode(slow.val);
	if(pre != null) {
		pre.next = null;
		fast = head;
		root.left = sortedListToBST(fast);
	}
	root.right = sortedListToBST(slow.next);
	return root; 
    }
}


3,Flatten Binary Tree to Linked List
将一个二叉树变为一个链表
例如给定一个二叉树
         1
        / \
       2   5
      / \   \
     3   4   6
输出:
   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6

通过深搜遍历二叉树,保留节点的右子树,将节点的right指向左子树,让后再将左子树指向右子树,当然这是一个递归的过程。代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void flatten(TreeNode root) {
        if(root == null) return;
        flatten(root.left);
        flatten(root.right);
        TreeNode left = root.left;
        TreeNode right = root.right;
        root.left = null;
        root.right = left;
        while(root.right != null){
            root = root.right;
        } 
        root.right = right;   
    }
}


我们还可以用堆栈,用先序遍历的方法依次保留二叉树节点,然后建立一颗只有右孩子的树,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
	static LinkedList<Integer> sb;
	public static void flatten(TreeNode root) {
        Stack<TreeNode> stack=new Stack<TreeNode>();
        sb = new LinkedList<Integer>();
        
        if(root==null) return;
        stack.push(root);
        dfs(root, stack);
        for(int i=1; i<sb.size(); i++){
            root.right=new TreeNode(sb.get(i));
            root.left = null;
            root = root.right;
        }

    }
    public static void dfs(TreeNode root, Stack<TreeNode> stack){
        while(!stack.isEmpty()){
             TreeNode node=stack.pop();
             sb.add(node.val);
             if(node.right!=null){
                stack.push(node.right);   
             }
            if(node.left!=null){
                stack.push(node.left); 
             }
        }
        System.out.println(sb);
    }
}
分享到:
评论

相关推荐

    binarytree.rar

    二叉树是一种在计算机科学中广泛使用的数据结构,它的每个节点最多有两个子节点,通常称为左子节点和右...解压“binarytree.rar”,查看其中的文件,理解数据结构,并根据给定的描述编写代码,以实现二叉树的前序遍历。

    leetcode的题目:Balanced Binary Tree

    在LeetCode的"Balanced Binary Tree"题目中,通常要求判断给定的二叉树是否是平衡的。这个问题可以通过递归或迭代的方式来解决。递归方法是分别检查左子树和右子树是否平衡,以及它们的高度。迭代方法则可以使用层次...

    recover-the-binary-tree.zip_The Tree

    题目中的"recover-the-binary-tree.zip_The Tree"文件包含了一个名为"recover the binary tree.cpp"的源代码文件,这很可能是实现这个恢复过程的C++程序。为了理解并执行这个过程,我们需要了解以下步骤: 1. **...

    MengZhaoFly#sword-byteDance-fe#二叉树的所有路径(binary-tree-paths)1

    题目二叉树所有路径题解* Definition for a binary tree node.* function TreeNode(val) {* @para

    leetcode伪代码-mergo-two-binary-tree:合并二叉树

    leetcode伪代码merge-two-binary-tree 题目解读: 题目来源: 原文: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the...

    LeetCode和剑指offer中的算法题的题目和解法 和 常见算法汇总

    1. Math Implementation Questions(数学实现题) ...5.1 Maximum Depth of Binary Tree(二叉树的深度) 5.2 Invert Binary Tree(反转二叉树) 5.3... 5.4... 5.5... 6. String Questions(字符串相关问题)

    minimum-depth-of-binary-tree.rar_leetcode

    在提供的"minimum depth of binary tree"代码中,可能包含了上述的一种或多种解冑策略。解冑代码应该能够处理各种类型的二叉树,包括平衡树和高度不均衡的树,同时具有良好的时间复杂度和空间复杂度。具体实现细节和...

    leetcode110-BinaryTree_HeightBalanced:力扣110

    至于提供的压缩包文件`BinaryTree_HeightBalanced-master`,它很可能包含了该问题的解决方案源代码,可能是用Python或其他编程语言实现的。解压后,你将能够看到具体的实现细节,包括如何创建二叉树节点、如何进行...

    Leetcode题目+解析+思路+答案.pdf

    - **Convert Sorted List/Array to Binary Search Tree**:将有序列表或数组转换为二叉搜索树。 - **Path Sum II**:寻找所有从根节点到叶节点的路径,其路径和等于给定的目标值。 - **Flatten Binary Tree to ...

    2018年最新Google Onsite面经总结1

    从标题和描述中可以看到,本文主要关注于LeetCode原题的总结,涵盖了162个题目,包括Find Peak Element、Isomorphic Strings、Group Shifted Strings等,这些题目都是Google Onsite面经中的常见题目。 下面将对这些...

    [数据结构与算法]JAVA二叉树题目总结(包含常见题目部分LeetCode题解)

    在IT领域,数据结构与算法是编程基础的重要组成部分,...总结,Java中的二叉树题目不仅要求对数据结构有深入理解,还需要灵活运用算法。不断练习和分析这些题目,能够帮助你提高编程技巧,增强在实际工作中的竞争力。

    前端大厂最新面试题-binary-indexed-tree.docx

    **二叉索引树(Binary Indexed Tree,BIT)**,又称 Fenwick 树,是数据结构中的一个重要概念,尤其在前端工程师的面试中常被问到。它是一种高效的数据结构,用于快速处理数组中区间的求和问题以及部分更新操作。在...

    leetcode卡-leetcode_practices_learncard_binarytree:我的leetcode练习二叉树学习卡

    本资源“leetcode_practices_learncard_binarytree”是一份全面的二叉树学习卡片,作者通过Java8语言完成了所有相关题目,旨在帮助学习者深入理解二叉树及其相关算法。 一、二叉树基础 二叉树是一种非线性数据结构...

    浙江大学2018-19秋冬《数据结构基础》期末模拟练习21

    以下是一些关于数据结构和算法的重要知识点,基于题目提供的内容: 1. **图的性质** - 在图论中,一个图如果有每个顶点的度数都是偶数,或者只有两个顶点的度数是奇数,那么可以找到一个哈密顿回路,即一个通过每条...

    算法文档无代码一些与树有关的题目

    - 二叉搜索树(Binary Search Tree, BST):一种特殊的二叉树,其中每个节点的左子树只包含小于当前节点的数,每个节点的右子树只包含大于当前节点的数。 - 红黑树(Red-Black Tree):一种自平衡的二叉搜索树,每条...

    二叉树的直径(diameter-of-binary-tree)

    代码一的解决方案首先定义了一个`diameterOfBinaryTree`函数,它递归地计算每个子节点的最大深度,并返回当前节点的最大深度。在这个过程中,通过`depth`函数计算节点的深度,同时更新全局变量`max`,存储当前找到的...

    leetcode卡-leetcode_binary_tree:https://leetcode.com/explore/learn/card/

    这个标签可能意味着LeetCode的二叉树专题卡片内容是开源的,也就是说,可能有一个开源项目或者代码库(如“leetcode_binary_tree-master”)包含了这些题目的解决方案或者其他学习资源。开源意味着社区可以贡献、...

    leetcode题目分类

    从文档中可以看出,这些题目覆盖了各种类型的数据结构和算法,如数组(array)、链表(linked list)、字符串(string)、哈希表(hashtable)、栈(stack)、队列(queue)、二叉树(binary tree)、图(graph)、...

    题目推荐_刘汝佳.pptx

    构造类题目如"7401 - Binary Tree (简单)"和"7269 - Snake Carpet (简单)",测试的是考生对于数据结构的理解和构建能力,可能是要求设计和实现特定功能的二叉树或其它数据结构。 算法类题目是核心部分,包括了"6203...

Global site tag (gtag.js) - Google Analytics