二叉树一个较实用的操作就是二叉树的复制,而二叉树的复制可以在后序遍历基础上实现。
代码实现:
//二叉树的复制操作
tree_pointer copy(tree_pointer original)
{
if(original)
{
tree_pointer temp=(tree_pointer)malloc(sizeof(node));
if(IS_FULL(temp))
{
fprintf(stderr,"The memory is full\n");
exit(1);
}
temp->left_child=copy(original->left_child);
temp->right_child=copy(original->right_child);
temp->data=original->data;
return temp;
}
return NULL;
}
另一个有用的操作是判断两颗二叉树是否相等,其可以在前序遍历的基础上实现。
代码实现:
//判断两颗二叉树是否相等
int equal(tree_pointer fisrt,tree_pointer second)
{
if((!fisrt&&!second)||(fisrt&&second&&fisrt->data==second->data))
{
equal(fisrt->left_child,second->left_child);
equal(fisrt->right_child,second->right_child);
return TRUE;
}
return FALSE;
}
可满足性问题:是否存在一种变量的赋值,使得表达式的值为真。如:
(x1∧¬x2)∨(¬x1∧x3)∨¬x3
,首先我们要计算括号里面的值,然后在计算整个表达式的值,直到整个表达式只有一个值。其表达式可以用二叉树来表示,结构如图:
因此我们可以用二叉树的后序遍历来实现这条表达式。
代码实现:
//逻辑值类型
typedef enum {not_logical,and_logical,or_logical,true_logical,false_logical} logical;
typedef struct node *tree_pointer;
struct node
{
int value;//变量真假值赋值
logical data;//逻辑值
tree_pointer left_child,right_child;
};
void post_order_eval(tree_pointer node)
{
if(node)
{
post_order_eval(node->left_child);
post_order_eval(node->right_child);
switch(node->data)
{
case not_logical:
node->value=!node->right_child->value;
break;
case and_logical:
node->value=node->left_child&&node->right_child;
break;
case or_logical:
node->value=node->left_child||node->right_child;
break;
case true_logical:
node->value=true;
break;
case false_logical:
node->value=false;
break;
}
}
}