C++非递归建立二叉树实例的攻略如下:
步骤一:定义二叉树的结构体
首先,我们需要定义一个二叉树的结构体。在这个结构体中,我们需要定义每个节点的值、左右子树指针。
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
// 构造函数
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
步骤二:非递归地建立二叉树
我们可以借助栈来非递归地建立二叉树。具体步骤如下:
- 创建一个栈,用于存储节点指针。
- 以先序遍历的方式读入二叉树的节点值,在读入一个节点值后,创建一个新节点,并将该节点入栈。
- 一旦遇到空节点,则从栈中弹出栈顶节点(它一定是最后一个非空节点的右子节点),然后继续读入节点值,并创建新节点。
- 循环执行步骤2和步骤3,直到所有节点都被读入并入栈。
下面是一个示例,演示如何使用非递归的方式构建下面这个二叉树。
1
/ \
2 3
/ \
4 5
// 根据先序遍历的序列创建一棵二叉树
TreeNode* createBinaryTree(vector<int>& preorder) {
if (preorder.empty()) {
return NULL;
}
stack<TreeNode*> s;
TreeNode* root = new TreeNode(preorder[0]);
TreeNode* p = root;
for (int i = 1; i < preorder.size(); ++i) {
if (preorder[i] < p->val) {
p->left = new TreeNode(preorder[i]);
s.push(p);
p = p->left;
} else {
while (!s.empty() && s.top()->val < preorder[i]) {
p = s.top();
s.pop();
}
p->right = new TreeNode(preorder[i]);
p = p->right;
}
}
return root;
}
步骤三:遍历二叉树
最后,我们可以通过递归方式或非递归方式遍历二叉树。这里提供一个用非递归方式实现的中序遍历的示例。
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> s;
TreeNode* p = root;
while (p != NULL || !s.empty()) {
while (p != NULL) {
s.push(p);
p = p->left;
}
p = s.top();
s.pop();
result.push_back(p->val);
p = p->right;
}
return result;
}
总结:通过以上步骤,我们就完成了用非递归的方式建立二叉树并进行遍历的示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++非递归建立二叉树实例 - Python技术站