이진 트리의 피날레-이진 트리 및 코드 구현의 세 가지 비 재귀 순회

이진 트리의 세 가지 비 재귀 순회

1. 바이너리 트리 프리오더 비 재귀 순회 구현 (스택 사용)

  • 아이디어 : (스택 사용)
    1. 먼저 cur이 비어 있지 않은 경우 나무의 뿌리를 cur로 표시하고,
    2. 뿌리를 직접 인쇄하고, 스택에 cur (즉, 뿌리)을 밀어 넣
    습니다. root의 왼쪽 하위 트리가 왼쪽으로 이동했습니다 .4.
    루프가 나오면 가장 왼쪽 노드가 스택에 배치되었습니다 .5
    . 그런 다음 대기열이 현재 비어 있지 않습니다 (가장 바깥 쪽의 조건입니다). 루프), 그리고 팝업됩니다 라인의 헤드 요소, 팝업 요소의 오른쪽 노드를 cur로 표시합니다 .6.
    오른쪽 노드가 비어 있지 않으면 오른쪽 노드를 인쇄하여 스택에 푸시해야합니다. 따라서 가장 바깥쪽에 조건이 추가되어 오른쪽 노드도 인쇄됩니다. 즉, cur은 비어 있지 않습니다.
// 二叉树前序非递归遍历实现,(采用栈)
    
    void preOrderTraversal1(Node root){
    
    
        if (root == null)return;

        Stack<Node> stack = new Stack<>();
        Node cur = root;
        while(cur != null || !stack.empty()){
    
    
            while(cur != null){
    
    
                System.out.print(cur.val);
                stack.push(cur);
                cur = cur.left;
            }
            Node top = stack.pop();
            cur = top.right;
        }
    }

2. 순차 비 재귀 순회

  • 아이디어 :
    1. 이전 시퀀스와 동일한 원리이지만 먼저 가장 왼쪽 노드를 찾고 왼쪽 노드를 인쇄 한 다음 루트를 인쇄 한 다음 오른쪽 노드를 인쇄합니다.
//中序非递归遍历
    void inOrderTraversal1(Node root){
    
    
        if (root == null)return;
        Stack<Node> stack = new Stack<>();
        Node cur = root;
        while(cur != null || !stack.empty()){
    
    
            while(cur != null){
    
    
                stack.push(cur);
                cur = cur.left;
            }
            Node top = stack.pop();
            System.out.print(top.val);
            cur = top.right;
        }
    }

3. 주문 후 비 재귀 순회

  • 아이디어 :
    1. 주문 후 순회는 또한 cur을 사용하여 노드를 하나씩 찾아서 마지막 왼쪽 노드로 푸시 한 다음 스택을 튀어 나와 왼쪽 노드를 인쇄합니다
    2. 그런 다음 오른쪽 노드가 있는지 확인합니다. 오른쪽 노드가 비어
    있으면 루트를 직접 인쇄합니다 .3. 하지만 오류, 즉
    yes 가 있으므로 나중에 노드가 반복적으로 인쇄되는 상황이있는 경우 인쇄 된 노드를 prev로 표시해야합니다. 다음 그림과 같이 인쇄 된 노드를 표시하지 않은 경우 노드 'H'가 인쇄되었지만 원래 인쇄해야 할 때 'E'를 표시 한 다음 올바른 노드 (cur .right)가 비어 있지 않으면 'H'가 스택에 다시 놓이게되므로 마킹해야합니다 .cur.right == prev 일 때 루트가 직접 인쇄되며 아래로 이동할 필요가 없습니다. 올바른 노드를 인쇄하려면 if 문을 입력하여 루트 노드를 인쇄 할 수 있습니다.
    여기에 사진 설명 삽입
//后序非递归遍历
    void postOrderTraversal1(Node root){
    
    
        if (root == null)return;
        Stack<Node> stack = new Stack<>();
        Node cur = root;
        Node prev=null;
        while(cur != null || !stack.empty()) {
    
    
            while (cur != null) {
    
    
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.peek();
            if (cur.right == null || cur.right == prev) {
    
    
                stack.pop();
                System.out.print(cur.val);
                prev = cur;
                cur = null;
            } else {
    
    
                cur = cur.right;
            }
        }
    }

추천

출처blog.csdn.net/qq_45665172/article/details/109602935