递归求深度:

struct node {
int data;
node* lchild;//指向左孩子的结点
node* rchild;//指向右孩子的结点

};
int depth(node* root) {
int l, r;
node* tem = new node;
if (root == nullptr) return 0;
if (root->lchild == nullptr && root->rchild == nullptr) return 1;
else {
if (root->lchild != nullptr) {
tem =root;
tem = tem->lchild;

l = depth(tem);
}
else if (root->rchild != nullptr) {
tem = root;
tem = tem->rchild;
r = depth(tem);
}
return max(l, r)+1;
}
}

int main()
{
node* a=new node, * b = new node, * c = new node;
node* root = new node;

a->data = 1;
b->data = 2; c->data = 3;
a->lchild = b; b->rchild = c; a->rchild = nullptr; b->lchild = nullptr;
c->lchild = c->rchild = NULL;
root->lchild = a;
root->data = 9;
cout << "深度:"<<depth(root);


return 0;
}

层序遍历求深度

利用队列的数据结构,每一层依次从左子树到右子树进入队列,队列为先进先出,因此上一层第一个进入的结点是下一层开始遍历的第一个父节点,所以层次遍历在下一层进入队列时,上一层也是从左到右的顺序出队。且每轮循环中只进入一个结点或者两个结点或无结点进队

初始时只有一个根结点,然后每次取出一个结点,就把它的左右子结点(如果存在)放进队列。

这样遍历二叉树的方法称为宽度优先遍历

struct node {
int data;
node* lchild;//指向左孩子的结点
node* rchild;//指向右孩子的结点

};
struct qutype {
node* bt;//一个结点
int level;//结点的深度
};
int depth(node* root) {

queue<qutype>qu;
qutype newqu;
= root;
newqu.level = 1;
qu.push(newqu);
int maxx;

while (!qu.empty()) {
qutype e = qu.front();
qu.pop();

if (->lchild != nullptr) {
= ->lchild;
e.level += 1;
qu.push(e);
}
if (->rchild != nullptr) {
= ->rchild;
e.level += 1;
qu.push(e);
}
maxx = e.level;
}
return maxx;

}

int main()
{
node* a = new node, * b = new node, * c = new node, * m = new node;
node* root = new node;
m->data = 9;
a->data = 1;
b->data = 2; c->data = 3;
a->lchild = b; b->rchild = c; a->rchild = nullptr; b->lchild = nullptr;
c->lchild = m;
c->rchild = NULL;
m->lchild = m->rchild = nullptr;
root->lchild = a;
root->data = 9;
cout << "层序遍历深度:"<<depth(root);


return 0;
}

运行后输出5.

【练习】c++分别用层序遍历和递归求二叉树深度_子树