MOOC 3.2 二叉树的存储结构及遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | // 二叉树的存储结构 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); } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步