依照上一篇博文所建立的二叉树,对其进行前序、中序、后续遍历:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std ;
//(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
struct Node {
int data ;
Node *left ;
Node *right ;
};
Node* newnode() {
Node *root = new Node ;
root->left = NULL ;
root->right = NULL ;
return root ;
};
void X_B(Node *root) {
cout << root->data << " " ;
if(root->left != NULL)
X_B(root->left) ;
if(root->right != NULL)
X_B(root->right) ;
}
int main() {
Node *root = newnode() ;
char s[100] ;
while(cin >> s ) {
Node *t = root ;
if(strcmp(s,"()") == 0 )
break ;
int data ;
sscanf(&s[1],"%d",&data);
char *s1 = (strchr(s,',')+1) ;
int len = strlen(s1) ;
for(int i = 0 ; i < len ; i++) {
if(s1[i] == 'L') {
if((t->left) == NULL)
t->left = newnode() ;
t = t -> left ;
}
else if(s1[i] == 'R') {
if((t->right) == NULL)
t->right = newnode() ;
t = t -> right ;
}
}
t -> data = data ;
}
X_B(root);
cout << endl ;
return 0 ;
}
求二叉树的深度:
先定义两个变量:h , depth ; h用来存放一个当前的深度,depth用来存放当前最大深度 ,如果h 比depth 大 就将h的值付给depth ;
代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std ;
//(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
struct Node {
int data ;
Node *left ;
Node *right ;
};
Node* newnode() {
Node *root = new Node ;
root->left = NULL ;
root->right = NULL ;
return root ;
};
void X_B(Node *root,int h , int &depth) {
if(h>depth)
depth = h ;
if(root->left != NULL)
X_B(root->left,h+1,depth) ;
if(root->right != NULL)
X_B(root->right,h+1,depth) ;
}
int main() {
Node *root = newnode() ;
char s[100] ;
while(cin >> s ) {
Node *t = root ;
if(strcmp(s,"()") == 0 )
break ;
int data ;
sscanf(&s[1],"%d",&data);
char *s1 = (strchr(s,',')+1) ;
int len = strlen(s1) ;
for(int i = 0 ; i < len ; i++) {
if(s1[i] == 'L') {
if((t->left) == NULL)
t->left = newnode() ;
t = t -> left ;
}
else if(s1[i] == 'R') {
if((t->right) == NULL)
t->right = newnode() ;
t = t -> right ;
}
}
t -> data = data ;
}
int depth = 1 ;
X_B(root,1,depth);
cout << depth << endl ;
return 0 ;
}
也可以用后序遍历求二叉树的深度:
从二叉树定义可以推出下面的结论:空树的深度为0,若二叉树不空,则它的深度等于其左子树深度和右子树深度中的最大值加1.,所以先分别求出其左、右子树的深度,然后取两者中的最大值,再加1便得二叉树的深度。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std ;
#define max(x,y) ((x)>(y)?(x):(y))
//(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
struct Node {
int data ;
Node *left ;
Node *right ;
};
Node* newnode() {
Node *root = new Node ;
root->left = NULL ;
root->right = NULL ;
return root ;
};
int HL = 1 , HR = 1 ;
int X_B(Node *root) {
if(root != NULL) {
HL = X_B(root->left) ;
HR = X_B(root->right) ;
return max(HL,HR)+1 ;
}
else
return 0 ;
}
int main() {
Node *root = newnode() ;
char s[100] ;
while(cin >> s ) {
Node *t = root ;
if(strcmp(s,"()") == 0 )
break ;
int data ;
sscanf(&s[1],"%d",&data);
char *s1 = (strchr(s,',')+1) ;
int len = strlen(s1) ;
for(int i = 0 ; i < len ; i++) {
if(s1[i] == 'L') {
if((t->left) == NULL)
t->left = newnode() ;
t = t -> left ;
}
else if(s1[i] == 'R') {
if((t->right) == NULL)
t->right = newnode() ;
t = t -> right ;
}
}
t -> data = data ;
}
cout << X_B(root) << endl ;
return 0 ;
}