题1:
JZ36 二叉搜索树与双向链表
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
注意: 1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构 4.你不用输出双向链表,程序会根据你的返回值自动打印输出
输入描述:
二叉树的根节点返回值描述:
双向链表的其中一个头节点。1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 TreeNode head=null; 16 TreeNode cur=null; 17 public TreeNode Convert(TreeNode pRootOfTree) { 18 if (pRootOfTree==null) return null; 19 Convert(pRootOfTree.left); 20 if (cur==null) { 21 cur=pRootOfTree; 22 head=pRootOfTree; 23 }else { 24 pRootOfTree.left=cur; 25 cur.right=pRootOfTree; 26 cur=pRootOfTree; 27 } 28 Convert(pRootOfTree.right); 29 return head; 30 } 31 32 33 }
思路:递归,先遍历找到头结点,利用全局变量记录头节点和当前节点,将当前节点和根节点转换,再递归转换右子树。
题2:
JZ79 判断是不是平衡二叉树
描述
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。 在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 样例解释: 样例二叉树如图,为一颗平衡二叉树 注:我们约定空树是平衡二叉树。 数据范围:n \le 100n≤100,树上节点的val值满足 0 \le n \le 10000≤n≤1000 要求:空间复杂度O(1)O(1),时间复杂度 O(n)O(n)输入描述:
输入一棵二叉树的根节点返回值描述:
输出一个布尔类型的值1 public class Solution { 2 public boolean IsBalanced_Solution(TreeNode root) { 3 if (root==null) return true; 4 int left=h(root.left),right=h(root.right); 5 if (Math.abs(left-right)>=2) return false; 6 return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right); 7 } 8 9 public int h(TreeNode root) { 10 if (root==null) return 0; 11 return Math.max(h(root.left),h(root.right))+1; 12 } 13 }
思路:递归。先判断左右子树高度差是否超过1,不超过再递归判断左右子树是否为平衡二叉树。