Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++ 프로그래밍에서 리프 노드가 될 때 이진 트리의 노드를 인쇄합니다.

<시간/>

이진 트리가 주어지면 리프 노드를 인쇄한 다음 해당 리프 노드를 제거한 다음 트리에 노드가 남지 않을 때까지 반복해야 합니다.

예시

C++ 프로그래밍에서 리프 노드가 될 때 이진 트리의 노드를 인쇄합니다.


C++ 프로그래밍에서 리프 노드가 될 때 이진 트리의 노드를 인쇄합니다.


C++ 프로그래밍에서 리프 노드가 될 때 이진 트리의 노드를 인쇄합니다.

따라서 문제의 출력은 다음과 같아야 합니다. -

6 7 9 13 143 421

접근

우리는 DFS를 적용하는 접근 방식을 채택했습니다.

임시 값을 적용하려면 모든 값에 0을 할당한 다음 최대(두 자식의 값)+1 값으로 모든 노드를 할당합니다. .

알고리즘

STARTSTEP 1-> DEFINE A struct Node WITH DATA MEMBERS data, order, *left, *rightSTEP 2-> DEFINE A struct Node* newNode(int data, int order) WITH struct Node* node =new Node, node->데이터 =데이터, 노드->순서 =순서, 노드->왼쪽 =NULL, 노드->오른쪽 =NULL, 반환(노드)FUNCTION void postod(struct Node* node, vector>&v )STEP 1-> IF 노드 ==NULL THEN, RETURNSTEP 2-> CALL FUNCTION postod(node->left, v)STEP 3-> CALL FUNCTION postod(node->right, v)STEP 4-> IF 노드-> right ==NULL &&node->left ==NULL THEN, SET node->order AS 1 v.push_back(make_pair(node->order, node->data)) ELSE node->order =max((node-> 왼쪽)->순서, (노드->우측)->순서) + 1 v.push_back(make_pair(노드->순서, 노드->데이터))END IFFUNCTION void printLeafNodes(int n, vector>&v)STEP 1-> sort(v.begin(), v.end())STEP 2-> LOOP FOR i =0 AND i  struct Node*와 같은 루트 노드 생성 root =newNode(8, 0)STEP 2-> DECLARE AND SET n =9STEP 3-> CALL postod(root, v);STEP 4-> CALL printLeafNodes(n, v); 

예시

#include 네임스페이스 std;struct Node { int data; 정수 순서; 구조체 노드* 왼쪽; struct Node* right;};struct Node* newNode(int data, int order){ struct Node* node =new Node; 노드->데이터 =데이터; 노드->주문 =주문; 노드->왼쪽 =NULL; 노드->오른쪽 =NULL; return (node);}void postod(struct Node* node, vector>&v){ if (node ​​==NULL) return; /* 왼쪽 자식에서 먼저 반복 */ postod(node->left, v); /* 이제 오른쪽 자식에서 반복됩니다. */ postod(node->right, v); // 현재 노드가 리프 노드인 경우 순서는 1입니다. if (node->right ==NULL &&node->left ==NULL) { node->order =1; // 할당된 값과 트리 값의 쌍을 만듭니다. v.push_back(make_pair(node->order, node->data)); } else { 노드->순서 =최대((노드->왼쪽)->순서, (노드->오른쪽)->순서) + 1; v.push_back(make_pair(노드->순서, 노드->데이터)); }} 무효 printLeafNodes(int n, vector>&v){ sort(v.begin(), v.end()); for (int i =0; i 왼쪽 =newNode(2, 0); 루트->오른쪽 =newNode(3, 0); 루트->왼쪽->왼쪽 =newNode(4, 0); 루트->왼쪽->오른쪽 =newNode(6, 0); 루트->오른쪽->왼쪽 =newNode(14, 0); 루트->오른쪽->오른쪽 =newNode(9, 0); 루트 -> 왼쪽 -> 왼쪽 -> 왼쪽 =newNode(7, 0); 루트 -> 왼쪽 -> 왼쪽 -> 오른쪽 =newNode(13, 0); 정수 n =9; 벡터<쌍> v; postod(루트, v); printLeafNodes(n, v); 반환 0;}

출력

이 프로그램은 출력물을 인쇄합니다 -

6 7 9 13 143 421