이 진 트 리 의 앞 순서, 중간 순서, 뒤 순서 의 실현 (재 귀 와 비 재 귀)

이 진 트 리 의 앞 순 서 는 옮 겨 다 니 고 중간 순 서 는 옮 겨 다 니 며 뒤 순 서 는 옮 겨 다 니 며 필기시험 면접 에서 자주 보 는 내용 이 었 는데 이번 에는 자신 이 모두 실현 되 었 다.
한두 시간 을 썼 으 니 총 결 된 셈 이다. 나중에 쓸 때 꺼 내 라. 만약 잘 쓰 지 못 하면 여러분 이 지적 해 주시 기 바 랍 니 다.
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef struct BiTree_Node
{
	char data;
	struct BiTree_Node *left, *right;
}BiTree_Node;

void CreateBiTree(BiTree_Node **root)
{
	char x;
	scanf("
%c",&x); if(x == '#') *root = NULL; else { *root = (BiTree_Node*)malloc(sizeof(BiTree_Node)); if(*root == NULL) printf("malloc error
"); (*root)->data = x; printf("please input %c left child
", x); CreateBiTree(&((*root)->left)); printf("please input %c right child
", x); CreateBiTree(&((*root)->right)); } } /* */ void PreOrder(BiTree_Node *root) { if(root == NULL) return ; printf("%c
",root->data); PreOrder(root->left); PreOrder(root->right); } /* */ void InOrder(BiTree_Node *root) { if(root == NULL) return ; InOrder(root->left); printf("%c
",root->data); InOrder(root->right); } /* */ void PostOrder(BiTree_Node *root) { if(root == NULL) return ; PostOrder(root->left); PostOrder(root->right); printf("%c
",root->data); } /* */ int Node_Num(BiTree_Node *root) { if(root == NULL) return 0; else return 1 + Node_Num(root->left) + Node_Num(root->right); } /* */ int depth(BiTree_Node *root) { if(root == NULL) return 0; int dl = depth(root->left); int dr = depth(root->right); return (dl>dr ? dl : dr) + 1; } /* */ void PreOrder_nocur(BiTree_Node *root) { if(root == NULL) return; stack BiTstack; BiTree_Node *node = (BiTree_Node*)malloc(sizeof(BiTree_Node)); BiTstack.push(root); while(!BiTstack.empty()) { node = BiTstack.top(); printf("%c
",node->data); BiTstack.pop(); if(node->right != NULL) BiTstack.push(node->right); if(node->left != NULL) BiTstack.push(node->left); } } /* */ void InOrder_nocur(BiTree_Node *root) { if(root == NULL) return ; BiTree_Node *node = root; /* */ stack BiTstack; while(node != NULL) { BiTstack.push(node); node = node->left; } while(!BiTstack.empty()) { node = BiTstack.top(); printf("%c
",node->data); BiTstack.pop(); /* , */ node = node->right; while(node != NULL) { BiTstack.push(node); node = node->left; } } } /* ------ */ void PostOrder_nocur(BiTree_Node *root) { stack s1, s2; BiTree_Node *node = root; s1.push(node); while(!s1.empty()) { node = s1.top(); s1.pop(); s2.push(node); if(node->right != NULL) s1.push(node->left); if(node->left != NULL) s1.push(node->right); } while(!s2.empty()) { node = s2.top(); s2.pop(); printf("%c
",node->data); } } /* */ void level_travel(BiTree_Node *root) { BiTree_Node *node; queue BiTQ; BiTQ.push(root); while(!BiTQ.empty()) { node = BiTQ.front(); BiTQ.pop(); printf("%c
",node->data); if(node->left != NULL) BiTQ.push(node); if(node->right != NULL) BiTQ.push(node); } } int main() { BiTree_Node *root; int flag = 1; while(flag){ printf("-----------------0. ---------------------
"); printf("-----------------1. -----------------------
"); printf("-----------------2. -----------------------
"); printf("-----------------3. -----------------------
"); printf("-----------------4. -----------------------
"); printf("-----------------5. -----------------------
"); printf("-----------------6. -----------------------
"); printf("-----------------7. -----------------
"); printf("-----------------8. -----------------
"); printf("-----------------9. -----------------
"); int x, len, num; scanf("
%d",&x); switch(x) { case 0:printf("please input the root
"); CreateBiTree(&root);break; case 1:PreOrder(root); break; case 2:InOrder(root); break; case 3:PostOrder(root);break; case 4:level_travel(root);break; case 5:len = depth(root);printf("depth:%d
",len);break; case 6:num = Node_Num(root);printf("node num:%d
",num);break; case 7:PreOrder_nocur(root);break; case 8:InOrder_nocur(root);break; case 9:PostOrder_nocur(root);break; default:flag = 0;break; } } return 0; }

나중에 다른 문제 에 부 딪 히 면

좋은 웹페이지 즐겨찾기