2.编写C语言程序实现在二叉树的中序遍历和后序遍历 递归和非递归算法并显示运行结果
时间: 2024-05-01 11:17:53 浏览: 121
好的,您的问题是如何在C语言中实现二叉树的中序遍历和后序遍历的递归和非递归算法,并显示运行结果。我会为您解答这个问题。
首先,我们需要明确什么是二叉树的中序遍历和后序遍历。
中序遍历:首先遍历左子树,然后是根节点,最后是右子树。
后序遍历:首先遍历左子树,然后是右子树,最后是根节点。
递归算法
二叉树的中序遍历和后序遍历递归算法非常简单。我们可以使用递归函数来实现。
中序遍历递归算法:
```
void inorderTraversal(TreeNode* root) {
if (root) {
inorderTraversal(root->left); // 先遍历左子树
printf("%d ", root->val); // 再遍历根节点
inorderTraversal(root->right); // 最后遍历右子树
}
}
```
后序遍历递归算法:
```
void postorderTraversal(TreeNode* root) {
if (root) {
postorderTraversal(root->left); // 先遍历左子树
postorderTraversal(root->right); // 再遍历右子树
printf("%d ", root->val); // 最后遍历根节点
}
}
```
非递归算法
非递归算法使用栈来实现。我们需要先将根节点压入栈中,然后将左子树节点一直压入栈中,直到左子树为空。然后弹出栈顶节点,访问该节点,再将右子树节点压入栈中,直到右子树为空。
中序遍历非递归算法:
```
void inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* node = root;
while (node || !s.empty()) {
while (node) {
s.push(node);
node = node->left; // 一直压入左子树节点
}
node = s.top();
s.pop();
printf("%d ", node->val);
node = node->right; // 如果右子树非空,将右子树节点压入栈中
}
}
```
后序遍历非递归算法:
```
void postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* node = root;
TreeNode* last = NULL;
while (node || !s.empty()) {
while (node) {
s.push(node);
node = node->left; // 一直压入左子树节点
}
node = s.top();
s.pop();
if (node->right && node->right != last) { // 如果右子树非空并且未被访问过
s.push(node);
node = node->right; // 将右子树节点压入栈中
} else {
printf("%d ", node->val);
last = node;
node = NULL;
}
}
}
```
以上是在C语言中实现二叉树的中序遍历和后序遍历的递归和非递归算法,并显示运行结果的方法。希望能够帮助到您!
阅读全文