【发布时间】:2010-02-07 13:23:20
【问题描述】:
我知道二叉搜索树上的按顺序遍历(访问左,访问根,访问右)会给我一个排序的结果。但我需要在二叉树上进行后序遍历(访问左、访问右、访问根),结果应该给我排序值。
为了实现这一点,我应该如何构建我的二叉树?
【问题讨论】:
标签: algorithm data-structures binary-tree binary-search
我知道二叉搜索树上的按顺序遍历(访问左,访问根,访问右)会给我一个排序的结果。但我需要在二叉树上进行后序遍历(访问左、访问右、访问根),结果应该给我排序值。
为了实现这一点,我应该如何构建我的二叉树?
【问题讨论】:
标签: algorithm data-structures binary-tree binary-search
由于根是最后访问的,它必须包含最大的项目。由于左子树在右子树之前被访问,因此左子树中的所有项都必须小于右子树中的任何项。
因此,要构造这样的树,您可以按以下步骤进行:如果插入大于根的项,则该项将成为新的根。如果插入一个小于根但大于左子树根的项,则将其插入右子树。否则将其插入左子树。
【讨论】:
您需要在树的每个节点上确保以下内容:
【讨论】:
这个子程序用于在树中插入 其中树结构是
struct tree
{
int data;
tree * left;
tree *right;
tree(int n) // constructor
{
data = n;
left = right = NULL;
}
};
算法是:
1. 如果树为空,则插入新节点。
2.如果新节点的数据大于根节点的数据,则创建新节点
树的根。
3. else 在树的左子树中插入新节点。
tree * insert(tree *root,int n)
{
if(root == NULL)
{
root = new tree(n);
return root;
}
else
{
if(n > root -> data)
{
tree * t = new tree(n);
t -> left = root;
return t;
}
else
{
root -> left = insert(root -> left,n);
return root;
}
}
}
【讨论】:
currently accepted answer 提供了一个很好的在线算法。一个更简单的解决方案——不在线,因此可能作弊——是在父指针中存储一个排序的链表。
换句话说:对数据进行排序;将最大的项放在根中,使其其中一个子树为空,然后将剩余 n-1 个项的后序排序树递归构造到另一个子树中。
树的高度为 n,单叶是列表的头部,根是最尾部的元素。如果您从叶子到根遍历树,则元素将形成一个递增序列,并且该路径将完全对应于后序遍历。
【讨论】:
删除
例如:
7 6
/ \ / \
3 6 =========DELETING 7 ============> 4 5
/ \ / \ /
1 2 4 5 3
/ \
1 2
【讨论】: