【Algo】二叉树(Binary Tree)

Backto Algo Index

先上代码,

定义

typedef struct TNode {
	ElemType data;
	TNode* lchild;
	TNode* rchild;
} TNode, *BiTree;

//helpers
bool IsEmptyTree(BiTree tree) {
	return tree == NULL;
}

遍历

  • 前序遍历(Pre-Order) : 中左右, parent->lchild->rchild
  • 中序遍历(In-Order): 左中右, lchild->parent->rchild
  • 后序遍历(Post-Order): 左右中, lchild->rchild->parent

左右子节点的访问顺序是固定的, 先左后右 LR. 这里区分的前中后, 指的是 父节点插入的位置. pLR, LpR, LRp.
在代码实现中, 递归是最自然的想法. 但是若考虑到性能, 防止栈溢出, 就需要自己手动在堆上实现栈, 然后模拟递归的过程.

void PreOrderTraverse(BiTree t) {
    if(!IsEmptyTree(t)) {
        printf("%d ", t->data);
        PreOrderTraverse(t->lchild);
        PreOrderTraverse(t->rchild);
    }
}

void InOrderTraverse(BiTree t) {
    if(!IsEmptyTree(t)) {       
        InOrderTraverse(t->lchild);
        printf("%d ", t->data);
        InOrderTraverse(t->rchild);
    }
}

void PostOrderTraverse(BiTree t) {
    if(!IsEmptyTree(t)) {
      PostOrderTraverse(t->lchild);
      PostOrderTraverse(t->rchild);
      printf("%d ", t->data);
    }
}

就是这么简单, 但是如果不想用recursion, 就必须自己手动实现一个栈, 然后按顺序 push-pop, 这就要求对细节掌控的非常好了.

Ref

  • 浅谈数据结构-二叉树 : 知识点总结的非常棒
  • 浅谈数据结构-树和二叉树之间关系 : 相互转化
  • 浅谈数据结构-树: 各种树

你可能感兴趣的:(binarytree,Algo)