문제를 풀다--두 갈래 나무(2)

2863 단어
두 갈래 나무 구조 변화
예lintcode 453.Flatten Binary Tree to Linked List https://www.lintcode.com/problem/flatten-binary-tree-to-linked-list/
traversal: 앞의 순서에 따라 구조를 변환하기 때문에 앞의 순서에 따라 귀속한다. 전역 변수는 루트 루트 노드이고 앞의 순서에 따라 구조의 변환을 한다.여기에 후효성 문제가 생길 수 있고 이차수 문제에 대해 우선 분치를 고려하여 해결하는 것도 나타난다.
 
divide conquer: 두 갈래 나무 문제는 분치법의 사고방식으로 이 나무가 문제의 답안에서 좌우 나무와 답안에서 어떤 관계가 있는지 고려하는 것이다.우선 좌우 트리가 결과를 되돌려 주었다면 뿌리를 어떻게 조작해야 할지 생각해 보자.왼쪽 나무의 끝 노드는 오른쪽 나무의 머리를 가리키고 뿌리의 왼쪽 나무는null이며 오른쪽 아이는 왼쪽 나무를 가리킨다.그래서 왼쪽 나무의 꼬리 노드를 알아야 한다.최종적으로 반환 값이 필요하지 않기 때문에recursion 함수의 반환 값은 끝 노드가 될 수 있습니다.왼쪽 나무 꼬리 노드가 비어 있지 않을 때 한 번 변환합니다.돌아올 때 우선 오른쪽 나무의 꼬리 노드가 비어 있는지 판단하고 비어 있지 않으면 돌아온다.그 다음에 왼쪽 트리 꼬리 노드가 판단하고 마지막으로 남은 상황은 루트로 돌아갑니다.recursion의 끝은 root==null입니다.
public class Solution {
    /**
     * @param root: a TreeNode, the root of the binary tree
     * @return: nothing
     */
    public void flatten(TreeNode root) {
        helper(root);
    }
    
    public TreeNode helper(TreeNode root){
        if(root == null)return null;
    
        TreeNode leftLast = helper(root.left);
        TreeNode rightLast = helper(root.right);
        
        if(leftLast != null){
            leftLast.right = root.right;
            root.right = root.left;
            root.left = null;
        }
     
        if(rightLast != null){
            return rightLast;
        }
        
        if(leftLast != null){
            return leftLast;
        }
    
        return root;
    }
}

좋은 웹페이지 즐겨찾기