二叉树

二叉树遍历方式(Tree Traversals )

二叉树_第1张图片
二叉树

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;
}

你可能感兴趣的:(二叉树)