黄哥Python: LeetCode199题 Binary Tree Right Side View

156 阅读2分钟
原文链接: zhuanlan.zhihu.com

LeetCode199题 Binary Tree Right Side View, 解题思路。

1、先读题,凡是同一层的,有右边的节点,只添加右边的。

2、用bfs 去解决,队列先添加右子树,再添加左子树,队列除了带node 信息,还得有当前层数的信息。

3、循环处理,当前层数没有被使用,就添加node的val。

黄哥用Python,Go,Java 三种语言实现了上面的解题思路。

Python 代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
# 黄哥Python培训 黄哥所写
class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        if root is None:
            return []
        res = []
        level = 1
        q = [[root,level]]
        used = []
        while q:
            node, currLevel = q.pop(0)
            if currLevel not in used:
                res.append(node.val)
                used.append(currLevel)
            
            if node.right:
                q.append([node.right, currLevel+1])               
            if  node.left:              
                q.append([node.left, currLevel+1])  
           
        return res

Go 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
// 黄哥Python培训 黄哥所写
func rightSideView(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    var res []int
    queue := [][]interface{}{{root, 1}}
    var used []int
    
    for len(queue) > 0 {
        temp := queue[0]
        queue = queue[1:]
        nodeInterface, currLevel := temp[0], temp[1]
        n,_ := currLevel.(int)
        node,_ := nodeInterface.(*TreeNode)
        
        if !inSlice(used, n){
            res = append(res, node.Val)
            used = append(used, n)
        }
        if node.Right != nil{
            queue = append(queue, []interface{}{node.Right, n+1})
        }
        if node.Left != nil {
            queue = append(queue, []interface{}{node.Left, n+1})
        }
    }
    return res
    
}

func inSlice(nums []int, n int) bool {
    if len(nums) == 0 {
        return false
    }
    for _, item := range nums {
        if item == n {
            return true
        }
    
    }
    return false
}

Java 代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.LinkedList; 
import java.util.Queue; 
//黄哥Python培训 黄哥所写
class Solution {
    public List<Integer>  rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        List<Integer> used = new ArrayList<>();
    
        Queue<MyParameters> q = new LinkedList<>(); 
        q.add(new MyParameters(root, 1));
            
        if (root == null) {
            return res;
        }
        
        while (q.size() > 0) {
            MyParameters temp = q.poll();
            TreeNode node = temp.node;
            int level = temp.level;
            
            if (!used.contains(level)) {
                res.add(node.val);
                used.add(level);                    
            }
            
            if (node.right != null) {
                q.add(new MyParameters(node.right, level + 1));
            }
            if (node.left != null) {
                q.add(new MyParameters(node.left, level + 1));
            }
        } 
        
        return res;
        
    }
    
    public class MyParameters {
         TreeNode node;
         int level;
          public MyParameters(TreeNode node, int level ) {
           this.node = node;
           this.level = level;
               }


  }


}
黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次zhuanlan.zhihu.com图标黄哥:黄哥Python培训是这样训练学员的zhuanlan.zhihu.com图标