이 진 트 리 기본 조작
typedef char ElementType;
typedef struct BiTreeNode
{
ElementType data;
struct BiTreeNode* lchild;
struct BiTreeNode* rchild;
}BiTreeNode, *BiTree;
2. 이 진 트 리 의 구축 과 소각 (1) 우선 순위 순 서 를 이용 하여 이 진 트 리 를 구축한다.
//
//
void createBiTree(BiTree &T)
{
char data;
data = getchar();
if(data == '#')
{
T = NULL;
}
else
{
T = new BiTreeNode;
T->data = data;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
(2) 광의 표를 이용 하여 이 진 트 리 만 들 기
//
void createBiTreeWithGenList(BiTree &T)
{
stack s;//
BiTree p = NULL;//
int k = 0;// , k==1 ,k==2
char ch = getchar();
//
if(ch!='#')
{
p = new BiTreeNode;
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
T = p;//
}
while((ch=getchar())!='#')
{
switch(ch)
{
case '(':
s.push(p);// , p ,p
k = 1; //
break;
case ',':
k = 2; //
break;
case ')':
s.pop();// ,
break;
default:
p = new BiTreeNode;
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
if(k==1)
s.top()->lchild = p;
else
s.top()->rchild = p;
}
}
}
(3) 이 진 트 리 를 출력 하 는 광의 표 표시
//
void printBiTreeWithGenList(const BiTree&T)
{
if(T)
{
cout<data;
if(T->lchild ||T->rchild)//
{
cout<lchild);// ,
if(T->rchild)
{
cout<rchild);
}
cout<
(4) 이 진 트 리 의 소각
//
void destroyBiTree(BiTree &T)
{
if(T)
{
destroyBiTree(T->lchild);
destroyBiTree(T->rchild);
delete T;
T = NULL;
}
}
3. 이 진 트 리 의 재 귀적 옮 겨 다 니 기 (1) 먼저 재 귀적 옮 겨 다 니 기
//
void preOrderTraverse(const BiTree &T)
{
if(T)
{
cout<data<lchild);//
preOrderTraverse(T->rchild);//
}
}
(2) 중간 순서 로 반복
//
void inOrderTraverse(const BiTree &T)
{
if(T)
{
inOrderTraverse(T->lchild);//
cout<data<rchild);//
}
}
(3) 뒷 순 서 를 반복 한다.
//
void postOrderTraverse(const BiTree &T)
{
if(T)
{
postOrderTraverse(T->lchild);//
postOrderTraverse(T->rchild);//
cout<data<
4. 이 진 트 리 의 다른 흔 한 재 귀 알고리즘
(1) 재 귀 트 리 의 깊이 (높이)
//
int depthOfBiTree(const BiTree &T)
{
int ldepth;
int rdepth;
if(T==NULL)//
return 0;
ldepth = depthOfBiTree(T->lchild);
rdepth = depthOfBiTree(T->rchild);
return (ldepth>rdepth)?(ldepth+1):(rdepth+1);
}
(2) 재 귀 구 나무의 잎 결점 개수
//
int leafCountOfBiTree(const BiTree &T)
{
if(T==NULL)
return 0;
if(T->lchild==NULL && T->rchild==NULL)
return 1;
return leafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild);
}
(3) 귀속 교환 좌우 자녀
//
void exchangeChild(BiTree &T)
{
if(T)
{
BiTree temp = NULL;
if(T->lchild ||T->rchild)
{
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
exchangeChild(T->lchild);
exchangeChild(T->rchild);
}
}
}
5. 완전한 테스트 코드
#include
#include
#include
using namespace std;
//
typedef char ElementType;
typedef struct BiTreeNode
{
ElementType data;
struct BiTreeNode* lchild;
struct BiTreeNode* rchild;
}BiTreeNode, *BiTree;
//
//
void createBiTree(BiTree &T)
{
char data;
data = getchar();
if(data == '#')
{
T = NULL;
}
else
{
T = new BiTreeNode;
T->data = data;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
//
void createBiTreeWithGenList(BiTree &T)
{
stack s;//
BiTree p = NULL;//
int k = 0;// , k==1 ,k==2
char ch = getchar();
//
if(ch!='#')
{
p = new BiTreeNode;
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
T = p;//
}
while((ch=getchar())!='#')
{
switch(ch)
{
case '(':
s.push(p);// , p ,p
k = 1; //
break;
case ',':
k = 2; //
break;
case ')':
s.pop();// ,
break;
default:
p = new BiTreeNode;
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
if(k==1)
s.top()->lchild = p;
else
s.top()->rchild = p;
}
}
}
//
void printBiTreeWithGenList(const BiTree&T)
{
if(T)
{
cout<data;
if(T->lchild ||T->rchild)//
{
cout<lchild);// ,
if(T->rchild)
{
cout<rchild);
}
cout<lchild);
destroyBiTree(T->rchild);
delete T;
T = NULL;
}
}
//
void preOrderTraverse(const BiTree &T)
{
if(T)
{
cout<data<lchild);//
preOrderTraverse(T->rchild);//
}
}
//
void inOrderTraverse(const BiTree &T)
{
if(T)
{
inOrderTraverse(T->lchild);//
cout<data<rchild);//
}
}
//
void postOrderTraverse(const BiTree &T)
{
if(T)
{
postOrderTraverse(T->lchild);//
postOrderTraverse(T->rchild);//
cout<data<lchild);
rdepth = depthOfBiTree(T->rchild);
return (ldepth>rdepth)?(ldepth+1):(rdepth+1);
}
//
int leafCountOfBiTree(const BiTree &T)
{
if(T==NULL)
return 0;
if(T->lchild==NULL && T->rchild==NULL)
return 1;
return leafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild);
}
//
void exchangeChild(BiTree &T)
{
if(T)
{
BiTree temp = NULL;
if(T->lchild ||T->rchild)
{
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
exchangeChild(T->lchild);
exchangeChild(T->rchild);
}
}
}
int main(int argc, char *argv[])
{
BiTree T = NULL;
createBiTree(T);// AB#D##CE###
// createBiTreeWithGenList(T);// A(B(,D),C(E))#
cout<
주: 본 고 는 글 을 전재 하기 위해 전재 원인: 나중에 스스로 보기 편 하 게 합 니 다.원문:http://blog.csdn.net/sysu_arui/article/details/7865873
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.