LeetCode hot100-199二叉树的右视图 ,114二叉树展开为链表
第一种方法DFS深度优先搜索dfs中先递归遍历右子树再递归遍历左子树。通过ans.size进行判断如果右子树为空的话右视图看到的就是左子树的元素。当depthans.size的话那么就是第一次到达这个深度对应的节点就在右视图当中。public ListInteger rightSideView(TreeNode root) { //DFS深度优先搜索 ListInteger ans new ArrayList(); dfs(root,0,ans); return ans; } public void dfs(TreeNode node,int depth,ListInteger ans){ if(node null){ return ; } if(depth ans.size()){ ans.add(node.val); } dfs(node.right,depth1,ans); dfs(node.left,depth1,ans); }第二种方法是类似于二叉树的层序遍历的模板定义ans结果集合cur当前层的节点集合nxt下一层的节点集合先把当前层的最新节点加入到ans中也就是右子树上的视图如果右为空的话很自然就是左子树上的结点。代码如下public ListInteger rightSideView(TreeNode root) { if (root null) { return List.of(); } ListInteger ans new ArrayList(); ListTreeNode cur List.of(root);//开始一层只有根节点 while (!cur.isEmpty()) {//当前层不为空 ans.add(cur.getLast().val);//先把当前层的最后加入的元素加入ans ListTreeNode nxt new ArrayList();//下一层的节点 for (TreeNode node : cur) {//遍历当前层的节点 if (node.left ! null) nxt.add(node.left);//判断左孩子 if (node.right ! null) nxt.add(node.right);//判断右孩子 } cur nxt;//将cur赋给下一层 } return ans; }第一种方法是DFS深度优先搜索传入root,进行递归先处理左子树再处理右子树。以左节点不为null为条件链接左右节点。以上图为例先深度递归到3处理链接3-4然后到2-3-4左子树处理完需要返回rightTail也就是4.因为需要把左右子树进行链接成4-5-6。综上处理完右子树进行链接为2-3-4-5-6。最后处理rootpublic void flatten(TreeNode root) { dfs(root); } public TreeNode dfs(TreeNode root){ if(root null){ return null; } TreeNode leftTail dfs(root.left); TreeNode rightTail dfs(root.right); if(leftTail ! null){ leftTail.right root.right; root.right root.left; root.left null; } return rightTail! null ? rightTail :leftTail ! null ? leftTail : root; }第二种方法是头插法首先定义一个全局的链表头节点核心思路是先处理右子树再处理左子树最后是root。如示例它会先root5传入找到右子节点6此时进入root6的递归左右均为nullnull就是链表的末尾然后将head指向当前的root,构成了6-null再向前类推即可得到最终链表。class Solution { private TreeNode head; public void flatten(TreeNode root) { if (root null) { return; } flatten(root.right); flatten(root.left); root.left null; root.right head; head root; } }参考来源作者灵茶山艾府链接https://leetcode.cn/problems/binary-tree-right-side-view/solutions/2015061/ru-he-ling-huo-yun-yong-di-gui-lai-kan-s-r1nc/。