递归求二叉树宽度,递归实现二叉树左右子树交换
Yyds干货库存
@TOC
首先,二叉树
1.概念
二叉树是节点的有限集合,它或者是空的,或者是由一个根节点加上两个叫做左子树和右子树的二叉树组成。
每个节点最多有两个子树,即二叉树中没有大于2的节点。
二叉树的子树分左右,子树的顺序不能颠倒。
3.特殊二叉树
1.完全二叉树
一棵二叉树,如果每一层的节点达到最大,就是全二叉树,也就是说,如果一棵二叉树的层数为k,节点总数为(2 k)-1,就是全二叉树。
2.完全二叉树
对于深度为k的二叉树,有n个节点,只有当每个节点和深度为k的完全二叉树中从1到n编号的节点才称为完全二叉树。
如果根节点的数量是1,则在非空二叉树的第I层上最多有2 (I-1)个节点。
如果根节点数为1,深度为h的二叉树中的最大节点数为(2 h)-1。
对于任意二叉树,如果叶节点数为n0,度为0,分支节点数为n2,则n0=N2 ^ 1。
(有好几个子树,度是一样的)
如果根节点数为1,则n个节点的全二叉树的深度h=log n。
2^h -1=N
2^h=N 1号
h=log 2 N 1
然而,由于省略了大O的渐进表示,时间复杂度变为O(log N)
不太了解大O递进表征的人:时间复杂度和空间复杂度
二、二叉树的整体实现
1.序言的实现
void pre order(Bt node * root)//)//前序根的左子树和右子树
if (root==NULL)
printf( NULL );
返回;
printf(%c ,root-data);
前序(左根);
前序(根右);
}
递归展开图
2.中间秩序的实现
Void inorder(BTnode* root)//中间顺序左子树根右子树
if (root==NULL)
printf( NULL );
返回;
inorder(根左);
printf(%c ,root-data);
inorder(根右);
}
递归展开图
3.后一序列的实现。
Void postorder(BTnode* root)//逆序左子树的右子树的根
if (root==NULL)
printf( NULL );
返回;
后序(根左);
后序(根右);
printf(%c ,root-data);
}
递归展开图
4.节点数量
Int treesize(BTnode* root)//节点数
if (root==NULL)
返回0;
返回treesize(左根)treesize(右根)1;
}
递归展开图
5.叶节点的数量
intreafsize(Bt node * root)//叶节点的数量
if (root==NULL)
返回0;
if(root-left==NULL root-right==NULL)//1只有在左右子树都为NULL的情况下才会返回。
返回1;
返回treeleafsize(根左)treeleafsize(根右);
}
递归展开图
6.序列遍历
void levelorder(BTnode* root)//序列遍历需要借助数据结构栈来实现。
队列q;
Queueinit( //初始化堆栈
如果(根)
queuepush( q,root);//将根节点放到堆栈上
而(!queueempty( q))
数据类型front=queuefront( //堆栈外
queue(//删除堆栈的顶部元素
printf(%c ,front-data);
如果(前左!=空)
queuepush( q,前左);//判断此时该节点的左子树是否为空,如果不是,则放入堆栈。
如果(前-右!=空)
queuepush( q,前右);//判断此时该节点的右子树是否为空,如果不是,则放入堆栈。
Queuedestroy( //销毁内存
}
我相信我会对学习更感兴趣。让我们一起欢呼吧。
不自信的小伙伴可以看看这个训练Niuke.com。
。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。