leetcode - 04 树专题 114~106~96~863~剑指Offer 27~257~108~617~ 剑指 Offer 07 重建二叉树~99
admin
2024-02-16 23:29:40
0次

文章目录

          • 114. 二叉树展开为链表
          • 106. 从中序与后序遍历序列构造二叉树
          • 96. 不同的二叉搜索树
          • 863. 二叉树中所有距离为 K 的结点
          • 剑指 Offer 27. 二叉树的镜像
          • 257. 二叉树的所有路径
          • 108. 将有序数组转换为二叉搜索树
          • 617. 合并二叉树
          • 剑指 Offer 07. 重建二叉树
          • 99. 恢复二叉搜索树

114. 二叉树展开为链表
class Solution {public void flatten(TreeNode root) {while (root!=null){// 重复处理TreeNode pNode = root.left;if(pNode != null){// 找到root节点左子树的右子树的最右侧节点while (pNode.right!=null){pNode = pNode.right;}// pNode的右子节点指向root的右子节点pNode.right = root.right;// root的右子节点执行root的左子节点root.right = root.left;// root的左子节点置为nullroot.left = null;}root = root.right;}}
}
106. 从中序与后序遍历序列构造二叉树
class Solution {HashMap map = new HashMap<>();public TreeNode buildTree(int[] inorder, int[] postorder) {int inleft = 0;int inrignt = inorder.length-1;int postleft = 0;int postright = postorder.length-1;for (int i=0;imap.put(inorder[i],i);}return rebuild(inleft,inrignt,postleft,postright,postorder,inorder);}private TreeNode rebuild(int inleft, int inrignt,  int postleft, int postright, int[] postorder, int[] inorder) {if(inleft>inrignt || postleft>postright){return null;}int rootValue = postorder[postright];TreeNode root = new TreeNode(rootValue);int index = map.get(rootValue);root.left = rebuild(inleft,index-1,postleft,postleft+index-inleft-1,postorder,inorder);root.right = rebuild(index+1,inrignt,postleft+index-inleft,postright-1,postorder,inorder);return root;}
}
96. 不同的二叉搜索树
class Solution {public int numTrees(int n) {// G(n) = G(0)*G(n-1) + G(1)*G(n-2) + ... +G(n-1)*G(0)// 动态规划int[] dp = new int[n+1];dp[0] = 1;dp[1] = 1;for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){// G(n) = G(0)*G(n-1) + G(1)*G(n-2) + ... + G(n-1)*G(0)//dp[2] = dp[0]*dp[1] +  dp[1]*dp[0]dp[i] += dp[j-1]*dp[i-j];}}return dp[n];}
}
863. 二叉树中所有距离为 K 的结点

class Solution {Map map = new HashMap<>();List res = new ArrayList<>();public List distanceK(TreeNode root, TreeNode target, int k) {// 从root出发dfs记录每个节点的父节点findParant(root);// 从target出发dfs寻找所有深度为k的节点TreeNode from = null;int depth = 0;findRes(target,from,depth,k);return res;}private void findRes(TreeNode node, TreeNode from, int depth, int k) {if(node==null){return;}if(depth==k){res.add(node.val);return;}if(node.left!=from){findRes(node.left,node,depth+1,k);}if(node.right!=from){findRes(node.right,node,depth+1,k);}if(map.get(node.val) != from){findRes(map.get(node.val),node,depth+1,k);}}private void findParant(TreeNode node) {if(node.left!=null){map.put(node.left.val,node);findParant(node.left);}if(node.right!=null){map.put(node.right.val,node);findParant(node.right);}}
}
剑指 Offer 27. 二叉树的镜像
class Solution {public TreeNode mirrorTree(TreeNode root) {if(root==null){return null;}TreeNode temp = root.left;root.left = root.right;root.right = temp;mirrorTree(root.left);mirrorTree(root.right);return root;}
}
257. 二叉树的所有路径

方法1:

class Solution {public List binaryTreePaths(TreeNode root) {List res = new ArrayList<>();dfs(root,"",res);return res;}private void dfs(TreeNode root, String path, List res) {if(root==null){return;}// 到达根节点,将路径添加到resif(root.left==null && root.right==null){res.add(path+root.val);return;}// 不是叶子节点,分别遍历左右节点dfs(root.left,path+root.val+"->",res);dfs(root.right,path+root.val+"->",res);}
}

方法2:

class Solution {public List binaryTreePaths(TreeNode root) {List res = new ArrayList<>();Stack stack = new Stack<>();// 将节点的入栈stack.push(root);// 将节点路径入栈stack.push(root.val+"");while (!stack.isEmpty()){String path = (String)stack.pop();TreeNode node = (TreeNode)stack.pop();if(node.left==null && node.right==null){// 说明是叶子节点res.add(path);}if(node.left!=null){stack.push(node.left);stack.push(path+"->"+node.left.val);}if(node.right!=null){stack.push(node.right);stack.push(path+"->"+node.right.val);}}return res;}
}
 
108. 将有序数组转换为二叉搜索树
class Solution {public TreeNode sortedArrayToBST(int[] nums) {if(nums.length==0){return null;}int left  = 0;int right = nums.length-1;return dfs(nums,left,right);}private TreeNode dfs(int[] nums, int left, int right) {if(left>right){return null;}int mid = (left+right)/2;TreeNode root = new TreeNode(nums[mid]);root.left = dfs(nums,left,mid-1);root.right = dfs(nums,mid+1,right);return root;}
}
617. 合并二叉树

方法1:

class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1==null || root2==null){return root1==null ? root2 : root1;}return dfs(root1,root2);}private TreeNode dfs(TreeNode root1, TreeNode root2) {if(root1==null || root2==null){return root1==null ? root2 : root1;}root1.val = root1.val+root2.val;root1.left = dfs(root1.left,root2.left);root1.right = dfs(root1.right,root2.right);return root1;}
}
剑指 Offer 07. 重建二叉树
class Solution {HashMap map = new HashMap<>()public TreeNode buildTree(int[] preorder, int[] inorder) {int preLeft = 0;int preRight = preorder.length-1;int inLeft= 0;int inRight = inorder.length-1;for(int i=0;imap.put(inorder[i],i);}return dfs(preLeft,preRight,preorder,inLeft,inRight,inorder,map);}private TreeNode dfs(int preLeft, int preRight, int[] preorder, int inLeft, int inRight, int[] inorder, HashMap map) {if(inLeft>inRight || preLeft>preRight){return null;}int rootValue = preorder[preLeft];TreeNode root = new TreeNode(rootValue);Integer index = map.get(rootValue);root.left = dfs(preLeft+1,preLeft+index-inLeft,preorder,inLeft,index-1,inorder,map);root.right = dfs(preLeft+index-inLeft+1,preRight,preorder,index+1,inRight,inorder,map);return root;}
}
99. 恢复二叉搜索树
class Solution {public void recoverTree(TreeNode root) {// 获取中序遍历结果List list = new ArrayList<>();dfs(root,list);// 找出中序遍历中错误顺序的两个数TreeNode x = null;TreeNode y = null;for(int i = 0;iif(list.get(i).val>list.get(i+1).val){y = list.get(i+1);if(x==null){x = list.get(i);}}}// 交换x和yif(x!=null && y!=null){int temp = x.val;x.val = y.val;y.val = temp;}}private void dfs(TreeNode root, List list) {if(root==null){return;}dfs(root.left,list);list.add(root);dfs(root.right,list);}
}

方法2:

相关内容

热门资讯

蜻蜓订购APP贵金属订购非法期...   蜻蜓订购APP以"投资平台"名义对外宣传,主打贵金属期货(订购)交易。该平台一方面强调自身"正规...
悟空订购APP非法期货交易欺骗...   近期,有投资者反映,“悟空订购APP”等平台以白银、贵金属订购为名,宣传所谓“高收益”“低门槛”...
小赢淘金APP期货投资骗局,平...   “小赢淘金”之流,最擅长的就是用“注册送现金”、“充值返券”的糖衣炮弹来引流。别天真地以为那是福...
八方淘金APP非法期货交易欺骗...   警惕!八方生财、每日淘金、小赢淘金、悟空订购、蜻蜓订购、斗金订购等APP均涉嫌非法期货交易!  ...
智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...