MOOC 3.2 二叉树的存储结构及遍历
// 二叉树的存储结构 typedef struct TreeNode *BinTree; typedef BinTree Position; struct TreeNode { ElementType Data; BinTree Left; BinTree Right; }; void PreOrderTraversal(BinTree BT) { if(BT) { printf("%d", BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); } } void InOrderTraversal(BinTree BT) { if(BT) { InOrderTraversal(BT->Left); printf("%d", BT->Data); InOrderTraversal(BT->Right); } } void PostOrderTraversal(BinTree BT) { if(BT) { InOrderTraversal(BT->Left); InOrderTraversal(BT->Right); printf("%d", BT->Data); } } // 中序遍历的非递归算法 (左根右) // 遇到一个结点, 就把它压栈, 并去遍历它的左子树 // 当左子树遍历结束后, 从栈顶弹出这个节点并访问它 // 然后按其右指针再去遍历该节点的右子树 void InOrderTraversal(BinTree BT) { BinTree T = BT; Stack S = CreateStack(MaxSize); // 创建并初始化堆栈S while(T || !IsEmpty(S)) { while(T) { Push(S, T); T = T->Left; } if(!IsEmpty(S)) { T = Pop(S); printf("%5d", T->Data); T = T->Right; } } } // 层序遍历 /* 队列实现: 遍历从根节点开始, 首先将根节点入队, 然后 开始执行循环: 结点出队, 访问该节点, 其左右儿子入队 */ /* 1. 从队列中取出一个元素 2. 访问该节点所指结点 3. 若该元素所指结点的左右孩子结点非空, 则 将其左右孩子的指针顺序入队 */ void LevelOrderTraversal(BinTree BT) { Queue Q; BinTree T; if(!BT) return ; // 若是空树则直接返回 Q = CreateQueue(MaxSize); // 创建并初始化队列Q AddQ(Q, BT); while(!IsEmptyQ(Q)) { T = DeleteQ(Q); printf("%d\n", T->Data); // 访问取出队列的结点 if(T->Left) AddQ(Q, T->Left); if(T->Right) AddQ(Q, T->Right); } }