中序和先序非递归建立二叉树程序代码
时间: 2023-12-26 11:20:40 浏览: 79
下面是中序和先序非递归建立二叉树的程序代码示例,以C++为例:
```c++
#include <iostream>
#include <stack>
using namespace std;
// 二叉树结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 中序和先序非递归建立二叉树函数
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty())
return NULL;
stack<TreeNode*> s;
int preIndex = 0, inIndex = 0;
TreeNode* root = new TreeNode(preorder[preIndex]);
s.push(root);
preIndex++;
while (preIndex < preorder.size()) {
TreeNode* cur = new TreeNode(preorder[preIndex]);
TreeNode* prev = NULL;
while (!s.empty() && s.top()->val == inorder[inIndex]) {
prev = s.top();
s.pop();
inIndex++;
}
if (prev != NULL) {
prev->right = cur;
} else {
s.top()->left = cur;
}
s.push(cur);
preIndex++;
}
return root;
}
// 中序遍历函数
void inorderTraversal(TreeNode* root) {
if (root == NULL)
return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
// 先序遍历函数
void preorderTraversal(TreeNode* root) {
if (root == NULL)
return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
vector<int> preorder = {1, 2, 4, 5, 3, 6};
vector<int> inorder = {4, 2, 5, 1, 3, 6};
TreeNode* root = buildTree(preorder, inorder);
cout << "Inorder traversal: ";
inorderTraversal(root);
cout << endl;
cout << "Preorder traversal: ";
preorderTraversal(root);
cout << endl;
return 0;
}
```
该程序中,我们使用一个栈来辅助建立二叉树。在建立二叉树时,我们首先将先序遍历序列的第一个节点入栈,并将其作为根节点。然后,我们遍历先序遍历序列中的所有节点,对于每个节点,如果其值与栈顶节点的值不相等,则将该节点作为栈顶节点的左子树,并将该节点入栈;否则,我们弹出栈顶节点,并将该节点作为栈顶节点的右子树。最后,我们返回根节点,即可得到建立好的二叉树。
在程序中,我们还提供了中序遍历和先序遍历函数,用于验证建立的二叉树是否正确。
阅读全文