二叉树遍历方式(Tree Traversals )
二叉树
1.中序(Inorder):Left->Root->Right。上图遍历顺序是:4,2,5,1,3
2.前序(Preorder):Root->Left->Right。上图遍历顺序是:1,2,4,5,3
3.后序(Postorder):Left->Right->Root。上图遍历顺序是:4,5,2,3,1
复杂度
我们都知道O(n)表示时间复杂度是线性,那么什么情况下用O(log n)表示呢?
要满足2个条件:
1.你搜索的下一个节点有可能是满足条件的节点
2.满足条件的节点只有一个
对树的操作的时间复杂度如下
1.search:O(log n)
2.insert:O(n)
3.remove:O(n)
删除(重点)
Status Delete(BiTree *&p){
//该节点为叶子节点,直接删除
BiTree *q, *s;
if (!p->rchild && !p->lchild)
{
delete p;
p = NULL; // Status Delete(BiTree *&p) 要加&才能使P指向NULL
}
else if(!p->rchild){ //右子树空则只需重接它的左子树
q=p->lchild;
p->data = p->lchild->data;
p->lchild=p->lchild->lchild;
p->rchild=p->lchild->rchild;
delete q;
}
else if(!p->lchild){ //左子树空只需重接它的右子树
q=p->rchild;
p->data = p->rchild->data;
p->lchild=p->rchild->lchild;
p->rchild=p->rchild->rchild;
delete q; }
else{ //左右子树均不空
q=p;
s=p->lchild;
while(s->rchild){
q=s;
s=s->rchild;
} //转左,然后向右到尽头
p->data = s->data; //s指向被删结点的“前驱”
if(q!=p)
q->rchild = s->lchild; //重接*q的右子树
else
q->lchild = s->lchild; //重接*q的左子树
delete s;
}
return true;
}