直接看代码:
#include<iostream>
#include<string>
using namespace std;
//代码简单易懂,没什么好说的
class Node{
char data;
Node *left,*right;
public:
Node(char ch){
data=ch;
left= nullptr;
right= nullptr;
}
void setLeft(Node *left) {
Node::left = left;
}
void setRight(Node *right) {
Node::right = right;
}
char getData() const {
return data;
}
Node *getLeft() const {
return left;
}
Node *getRight() const {
return right;
}
};
class Tree{
Node* root;
string strTree;
int pos;
public:
void create(string s){
pos=0;
strTree=s;
root= createTree();
}
Node* createTree(){
Node *t;
char ch= strTree.at(pos++);
if(ch=='0'){
t= nullptr;
}else{
t=new Node(ch);
t->setLeft(createTree());
t->setRight(createTree());
}
return t;
}
int treeDepth(Node *t){
if(t== nullptr){
return 0;
}
//直接递归到最左边的叶子结点,然后left回溯的时候每一层都会加1
int leftDepth= treeDepth(t->getLeft());
//左节点回溯的过程中把当前结点的右子树递归访问
int rightDepth= treeDepth(t->getRight());
//故在每一个分岔点,得到的是其左右子树的最大高度(深度)
return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
}
Node *getRoot() const {
return root;
}
};
int main(){
//n次循环,计算n个二叉树的高度
int n;
cin>>n;
for(int i=0;i<n;i++){
//s为二叉树的“字符串形式”
string s;
cin>>s;
Tree *tree=new Tree();
tree->create(s);
int depth=tree->treeDepth(tree->getRoot());
cout<<depth<<endl;
}
return 0;
}
我是花花,祝自己也祝您变强了~