C语言实现二叉树遍历的迭代算法可以分为三种:前序遍历、中序遍历和后序遍历。下面分别进行详细讲解:
前序遍历
前序遍历的迭代算法相对简单,可以通过栈结构实现。具体过程如下:
- 将根节点入栈。
- 循环执行以下步骤直至栈为空:
- 弹出栈顶节点并打印。
- 如果该节点的右子节点不为空,将其入栈。
- 如果该节点的左子节点不为空,将其入栈。
示例代码如下:
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> st; // 使用栈结构
st.push(root); // 根节点入栈
while(!st.empty()) { // 栈不为空时循环
TreeNode* node = st.top();
st.pop();
printf("%d ", node->val); // 弹出节点并打印
if (node->right != NULL) st.push(node->right); // 右子节点入栈
if (node->left != NULL) st.push(node->left); // 左子节点入栈
}
}
中序遍历
中序遍历的迭代算法稍微复杂一些,同样需要利用栈结构,并且需要用到指针。具体过程如下:
- 将根节点入栈。
- 循环执行以下步骤直至栈为空:
- 如果栈顶节点的左子节点不为空,将其入栈。
- 否则,弹出栈顶节点并打印,并将其右子节点入栈。
示例代码如下:
void inorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> st; // 使用栈结构
TreeNode* node = root;
while(!st.empty() || node != NULL) { // 栈不为空或当前节点不为空时循环
if (node != NULL) {
st.push(node); // 左子节点入栈
node = node->left;
} else {
node = st.top();
st.pop();
printf("%d ", node->val); // 弹出节点并打印
node = node->right; // 右子节点变为当前节点
}
}
}
后序遍历
后序遍历的迭代算法最为复杂,需要用到两个栈结构,过程比较繁琐,具体如下:
- 将根节点入栈。
- 循环执行以下步骤直至栈1为空:
- 弹出栈1顶部节点,并将其入栈2。
- 如果该节点的左子节点不为空,将其入栈1。
- 如果该节点的右子节点不为空,将其入栈1。
- 循环执行以下步骤直至栈2为空:
- 弹出栈2顶部节点并打印。
示例代码如下:
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> st1, st2; // 使用两个栈结构
st1.push(root); // 根节点入栈1
while(!st1.empty()) { // 栈1不为空时循环
TreeNode* node = st1.top();
st1.pop();
st2.push(node); // 栈1节点入栈2
if (node->left != NULL) st1.push(node->left); // 左子节点入栈1
if (node->right != NULL) st1.push(node->right); // 右子节点入栈1
}
while(!st2.empty()) { // 栈2不为空时循环
TreeNode* node = st2.top();
st2.pop();
printf("%d ", node->val); // 弹出节点并打印
}
}
以上就是C语言实现二叉树遍历的迭代算法的攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现二叉树遍历的迭代算法 - Python技术站