【D5】二叉树的中序遍历 & 二叉树展开为链表 & 填充每个节点的下一个右侧节点指针 (LC 94&114&116)

94. 二叉树的中序遍历

问题描述

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

代码实现1-递归法

class Solution {
    public List inorderTraversal(TreeNode root) {
       List res = new ArrayList();
       inorder(root,res);
       return res;
    }

    public void inorder(TreeNode root, List res){
        if(root == null){
            return;
        }
        inorder(root.left, res);
        res.add(root.val);
        inorder(root.right, res);
    }   
}

代码实现2-迭代法

class Solution {
    public List inorderTraversal(TreeNode root) {
       List res = new ArrayList();

       Deque stack = new LinkedList<>();
       while(root != null || !stack.isEmpty()){  
           while(root != null){
               //左子树入栈
               stack.offerLast(root);
               root = root.left;
           }
           //节点出栈
           root = stack.removeLast();
           res.add(root.val);
           root = root.right;
       }
       return res;
    }   
}

114. 二叉树展开为链表

问题描述

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

解题思路

先获取先序遍历的结果,然后根据先序遍历的结果修改二叉树的原有结构

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
        //用队列存储先序遍历的结果
        Queue preOrder = new LinkedList<>();
        
        //1.得到先序遍历的结果
        Deque stack = new LinkedList<>();
        while(root != null || !stack.isEmpty()){
           while(root != null){
               preOrder.add(root);
               stack.offerLast(root);
               root = root.left;
           }
           root = stack.removeLast();
           root = root.right;
        }
        
        if(preOrder.size() > 1){
            //2.如果节点数大于1,构建新的左右子树
            root = preOrder.remove();
            while(!preOrder.isEmpty()){
                root.left = null;
                root.right = preOrder.remove();
                root = root.right;
            }
        }
    
    }
}

116. 填充每个节点的下一个右侧节点指针

问题描述

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。

解题思路

需要连接的节点有两类。一类是同一父节点的左右节点;另一类是在同一层的相邻父节点的右子节点 与左子节点。

代码实现

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if(root == null){
            return root;
        }
        if(root.left != null){
            //连接同一父节点的左右节点。示例图中的2->3
            root.left.next = root.right;
            if(root.next != null){
                 //连接不同父节点的右左节点。示例图中5->6
                 root.right.next = root.next.left;
            }
        } 
        connect(root.left);
        connect(root.right);
        return root;   
    }
}

你可能感兴趣的:(【D5】二叉树的中序遍历 & 二叉树展开为链表 & 填充每个节点的下一个右侧节点指针 (LC 94&114&116))