두 갈래 나무의 반복 (귀속과 비귀속)

2890 단어

1. 두 갈래 나무의 두루


앞 순서 반복: 뿌리, 왼쪽, 오른쪽 중간 순서 반복: 왼쪽, 뿌리, 오른쪽 후속 반복: 왼쪽, 오른쪽, 뿌리

2. 귀속 및 비귀속의 실현


두 갈래 나무는 원래 귀속이 정의된 것이기 때문에 귀속 방식은 두 갈래 나무의 역행을 실현하는 것이 비교적 간단하다.비귀속 방식은 주로 Stack으로 데이터를 저장하고current 바늘로 현재 접근하는 노드를 가리킨다.
import java.util.Stack;

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data){
        val = data;
    }

    public void visit(TreeNode node){
        if(node != null){
            System.out.println(node.val);
        }
    }

    // 
    public void preOrder(TreeNode root){
        if(root != null){
            visit(root);
            preOrder(root.left);
            preOrder(root.right);
        }
    }

    // 
    public void preOrder_no(TreeNode root){
        Stack stack = new Stack();
        TreeNode current = root;
        while(current !=null || ! stack.isEmpty()){
            while(current != null){
                visit(current);
                stack.push(current);
                current = current.left;
            }
            if(!stack.isEmpty()){
                TreeNode temp = stack.pop();
                current = temp.right;
            }
        }
    }

    // 
    public void inOrder(TreeNode root){
        if(root != null){
            inOrder(root.left);
            visit(root);
            inOrder(root.right);
        }
    }

    // 
    public void inOrder_no(TreeNode root){
        Stack stack = new Stack();
        TreeNode current = root;
        while (current != null || !stack.isEmpty()){
            while(current != null){
                stack.push(current);
                current = current.left;
            }
            if(!stack.isEmpty()){
                TreeNode temp = stack.pop();
                visit(temp);
                current = temp.right;
            }
        }
    }

    // 
    public void postOrder(TreeNode root){
        if(root != null){
            postOrder(root.left);
            postOrder(root.right);
            visit(root);
        }
    }

    //  , previsited 
    public void postOrder_no(TreeNode root){
        Stack stack = new Stack();
        TreeNode current = root;
        TreeNode privisited = null;
        while(current != null || !stack.isEmpty()){
            while(current != null){
                stack.push(current);
                current = current.left;
            }
            current = stack.peek();
            if(current.right == null ||current.right == privisited){
                visit(current);
                stack.pop();
                privisited = current;
                current = null;

            }else{
                current = current.right;
            }
        }
    }

}

좋은 웹페이지 즐겨찾기