二叉树是特殊的树,每一个节点最多有两个儿子。、
一、几个特殊的二叉树:
1.斜树:只有左子树或者只有右子树的树。
2.满二叉树:所有的分支节点都存在左子树与右子树,并且所有的叶子都在同一层。
3.完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树中编号为i的编号的结点在二叉树中的位置完全相同,则这棵树被称为完全二叉树。// 一个满二叉树一定是完全二叉树。俩特点:1.深度为k的完全二叉树在k-1层是满二叉树,2.叶子节点只能出现在最下面两层,左侧节点都是连续的,度为1的结点只能有左孩子。
规律: 度为零的结点个数==度为2 的结点个数+1;在一棵深度为k的树中,最多有2的k次方-1个结点。
二、二叉树的遍历 (递归) //非递归要用到栈
1.前序:根左右;中序:左根右;后续:左右根;
例:前序:
void BiTree::preorder(BiNode *bt)//扩展的二叉树 { if(bt==NULL) return;//递归结束的条件 else{ cout<<bt->data;//访问根节点 preorder(bt->lchild);//访问根的左儿子 preorder(bt->rchild);//访问根的右儿子 } }
中序以及后续操作只需要调整 访问次序就可以实现。
2.层次遍历(运用到队列)//广度优先
思想:无条件的根节点入队,进行一个循环,循环里面执行队首元素出队他的左儿子以及右儿子入队;不断执行,知道没有了。
代码:
Void BiTree::LevelOrder(BinaryTreeNode *root){
queue<BiTreeNode*> aQueue;//存储结点指针的队列
//无条件入队
if(root)
aQueue.push(root);
while(!aQueue.empty())
{
root=aQueue.front(); //取队列首结点
aQueue.pop();
cout<<pointer->data;//访问当前结点
if(root->lchild)//判断是否有
aQueue.push(root->lchild);
if(root->rchild) //同上
aQueue.push(root->rchild);
}
}
三、构建与析构
递归思想
顺序构建
class BiTree { public: BiTree(){root=create();}//对应起来 ~BiTree(){release(root); private: BiNode *root; BiNode *create();//构造函数调用 “*”不能掉了 void release(BiNode *bt); };
构建函数:
BiNode *BiTree::create() { BiNode *bt; char a;// 输入的数据什么类型需要见机行事。 cin>>a; if(a=='#') bt=NULL; else { bt=new BiNode; bt->data=a; bt->lchild=create(); bt->rchild=create(); } return bt;//! ! !不能忘记返回值!!! }
析构函数 递归,不断地删除。
void BiTree::release(BiNode *bt) { if(bt==NULL) return; else { release(bt->rchild); release(bt->lchild); delete bt; } }
完整的树的实现:
#include<iostream> using namespace std; struct BiNode { char data; BiNode *rchild; BiNode *lchild; }; class BiTree { public: BiTree(){root=create();} ~BiTree(){release(root);} void preorder(){preorder(root);} void inorder(){inorder(root);} void postorder(){postorder(root);} private: BiNode *root; BiNode *create(); void release(BiNode *bt); void preorder(BiNode *bt); void inorder(BiNode *bt); void postorder(BiNode *bt); }; BiNode *BiTree::create() { BiNode *bt; char a; cin>>a; if(a=='#') bt=NULL; else { bt=new BiNode; bt->data=a; bt->lchild=create(); bt->rchild=create(); } return bt; } void BiTree::release(BiNode *bt) { if(bt==NULL) return; else { release(bt->rchild); release(bt->lchild); delete bt; } } void BiTree::preorder(BiNode *bt) { if(bt==NULL) return; else{ cout<<bt->data; preorder(bt->lchild); preorder(bt->rchild); } } void BiTree::inorder(BiNode *bt) { if(bt==NULL) return; else{ inorder(bt->lchild); cout<<bt->data; inorder(bt->rchild); } } void BiTree::postorder(BiNode *bt) { if(bt==NULL) return; else{ postorder(bt->lchild); postorder(bt->rchild); cout<<bt->data; } }
运行结果: