차례
문제 정책
“두 스택을 사용한 반복적 인 포스트 오더 순회”문제는 n 개의 노드가있는 이진 트리가 제공된다는 것을 나타냅니다. 두 개의 스택을 사용하여 반복적 인 postorder traversal을위한 프로그램을 작성하십시오.
예
입력
4 5 2 6 7 3 1
입력
4 2 3 1
암호알고리즘
- 다음으로 구성된 노드에 대한 구조를 만듭니다. 정수 데이터 및 XNUMX 노드 유형 포인터를 왼쪽 및 오른쪽으로 유지하는 변수입니다.
- 그런 다음 정수 값을 매개 변수로 받아들이는 새 노드를 만드는 함수를 만듭니다. 그 안에 노드를 만듭니다. 매개 변수로 전달 된 정수 값을 데이터 변수에 저장하고 오른쪽 및 왼쪽 포인터 노드를 null로 업데이트합니다. 새로 생성 된 노드를 반환합니다.
- 마찬가지로, 반복을위한 함수를 만듭니다. 주문 후 순회 바이너리 트리의 루트 노드에 대한 포인터를받습니다. 루트 노드가 null인지 확인하고 반환합니다.
- 두 개 만들기 스택 순회에 도움이되는 Node * 유형의 데이터 구조.
- 스택에 루트 노드 푸시 / 삽입 1. 다른 새 노드를 만듭니다.
- 스택 1은 비어 있지 않지만 즉 스택 1의 크기는 0이 아닙니다. 새 노드의 스택 1의 맨 위에 노드를 저장하고 스택에서 팝 / 제거합니다. 제거 된 노드를 스택에 푸시 / 삽입 2. 현재 노드의 왼쪽이 있는지 확인하고 스택 1에 푸시 / 삽입합니다. 마찬가지로 노드의 오른쪽이 있는지 확인하고 스택 1에 푸시합니다.
- 스택 1이 비어 있지 않은 상태에서 다시 트래버스하고 두 번째 스택의 스택 1 맨 위에 노드를 저장하고 첫 번째 스택에서 팝합니다.
- 마지막으로 두 번째 노드를 인쇄합니다.
암호
두 스택을 사용하는 반복적 인 사후 순회를위한 C ++ 프로그램
#include <bits/stdc++.h> using namespace std; struct Node{ int data; Node *left, *right; }; Node* newNode(int data){ Node* node = new Node; node->data = data; node->left = node->right = NULL; return node; } void postOrderIterative(Node* root){ if(root == NULL){ return; } stack<Node *> s1, s2; s1.push(root); Node* node; while(!s1.empty()){ node = s1.top(); s1.pop(); s2.push(node); if(node->left){ s1.push(node->left); } if(node->right){ s1.push(node->right); } } while(!s2.empty()){ node = s2.top(); s2.pop(); cout << node->data << " "; } } int main(){ Node* root = NULL; root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); root->right->left = newNode(6); root->right->right = newNode(7); postOrderIterative(root); return 0; }
4 5 2 6 7 3 1
두 스택을 사용하는 반복적 후순 순회를위한 Java 프로그램
import java.util.*; class IterativePostorder{ static class node{ int data; node left, right; public node(int data){ this.data = data; } } static Stack<node> s1, s2; static void postOrderIterative(node root){ s1 = new Stack<>(); s2 = new Stack<>(); if(root == null){ return; } s1.push(root); while(!s1.isEmpty()){ node temp = s1.pop(); s2.push(temp); if(temp.left != null){ s1.push(temp.left); } if(temp.right != null){ s1.push(temp.right); } } while(!s2.isEmpty()){ node temp = s2.pop(); System.out.print(temp.data + " "); } } public static void main(String[] args){ node root = null; root = new node(1); root.left = new node(2); root.right = new node(3); root.left.left = new node(4); root.left.right = new node(5); root.right.left = new node(6); root.right.right = new node(7); postOrderIterative(root); } }
4 5 2 6 7 3 1
복잡성 분석
시간 복잡성
O (N) 여기서 n은 삽입 된 노드의 수입니다.
공간 복잡성
O (N) n 개의 노드에 공간을 사용했기 때문입니다.