C语言实现树与二叉树的转换
C语言实现树与二叉树的转换,可以通过将树的每个节点的左右子树,分别放在它的左右指针中,即可实现。
文章目录
一、树的前序、后序的递归算法
1.1 前序遍历:
从根节点开始,先访问根节点,再访问其左子树,最后访问其右子树。
递归实现:
void preOrder(Node* root) {
if (root == NULL) return;
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
1.2 后序遍历:
从根节点开始,先访问其左子树,再访问其右子树,最后访问根节点。
递归实现:
void postOrder(Node* root) {
if (root == NULL) return;
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->data);
}
二、树的前序、后序的非递归算法实现:
2.1 前序遍历:
从根节点开始,先访问根节点,再访问其左子树,最后访问其右子树。
非递归实现:
void preOrderNonRecursive(Node* root) {
if (root == NULL) return;
stack> s;
s.push(root);
while (!s.empty()){
Node* curr = s.top();
s.pop();
printf ("%d ", curr->data);
if (curr->right) s.push(curr->right);
if (curr->left) s.push(curr->left);
}
}
2.2后序遍历:
从根节点开始,先访问其左子树,再访问其右子树,最后访问根节点。
非递归实现:
void postOrderNonRecursive(Node* root) {
if (root == NULL) return;
stack> s1, s2;
s1.push(root);
Node* node;
while (!s1.empty()){
node = s1.top();
s1.pop();
s2.push(node);
if (node->left)
s1.push(node->left);
if (node->right)
s1.push(node->right);
}
while (!s2.empty()){
node = s2.top();
s2.pop();
printf("%d ", node->data);
}
}
三、层次序的非递归算法实现:
3.1非递归实现:从根节点开始,按照层次从上到下遍历每个节点,从左到右访问。
void levelOrder(Node* root) {
if (root == NULL) return;
queue> q;
q.push(root);
while (!q.empty()){
int n = q.size();
for (int i = 0; i < n; i++){
Node* curr = q.front();
q.pop();
printf("%d ", curr->data);
if (curr->left) q.push(curr->left);
if (curr->right) q.push(curr->right);
}
printf("\n");
}
}
总结
建树的实现:
可以使用前序遍历的方法,先将根节点放进树中,然后依次将左右子树放进树中,以此类推,即可建立一棵树。