我需要一些递归帮助。我正在尝试用C#做一个二叉树,我想知道是否有可能用递归函数演示所有Inorder / PostOrder和PreOrder遍历。
我已经为PreOrder完成了它,然后尝试了InOrder然而导致了StackOverflow异常,我对二叉树的掌握最多是脆弱的,所以任何帮助都会非常感激,即使它看起来像是一个愚蠢的问题。
以下代码是我用于PreOrder Traversal的内容;
public void recursivePreorder(BinaryTreeNode root)
{
Console.Write(root.Data.ToString());
if (root.Left != null)
{
recursivePreorder(root.Left);
}
if (root.Right != null)
{
recursivePreorder(root.Right);
}
}
public void preorderTraversal()
{
if (Root != null)
{
recursivePreorder(Root);
}
else
{
Console.WriteLine("There is no tree to process");
}
static void Main(string[] args)
{
// Build the tree
Test.Add(5);
Test.Add(2);
Test.Add(1);
Test.Add(3);
Test.Add(3); // Duplicates are OK
Test.Add(4);
Test.Add(6);
Test.Add(10);
Test.Add(7);
Test.Add(8);
Test.Add(9);
// Test if we can find values in the tree
for (int Lp = 1; Lp <= 10; Lp++)
Console.WriteLine("Find Student ID ({0}) = {1}", Lp, Test.Find(Lp));
// Test if we can find a non-existing value
Console.WriteLine("Find Student ID (999) = {0}", Test.Find(999));
// Iterate over all members in the tree -- values are returned in sorted order
foreach (int value in Test)
{
Console.WriteLine("Value: {0}", value);
}
Console.WriteLine("Preorder Traversal");
Console.WriteLine("");
Test.preorderTraversal();
Console.WriteLine("");
}
在此先感谢,这绝对是我无法理解的问题,我甚至不确定是否可能。
答案 0 :(得分:4)
Inorder与您已有的非常相似,只需稍微移动您处理当前节点的代码:
public void recursiveInorder(BinaryTreeNode root)
{
if (root.Left != null)
{
recursiveInorder(root.Left);
}
Console.Write(root.Data.ToString());
if (root.Right != null)
{
recursiveInorder(root.Right);
}
}
预先排序的不同之处仅在于您首先遍历左子树,然后处理当前节点并最终遍历右子树。
答案 1 :(得分:2)
tree traversal州的维基页面:
二叉树
要遍历预订中的非空二进制树,请在每个节点处递归执行以下操作, 与根节点:
- 访问root。
- 遍历左子树。
- 遍历正确的子树。
醇>要遍历 inorder (对称)中的非空二进制树,请执行 在每个节点递归执行以下操作:
- 遍历左子树。
- 访问root。
- 遍历正确的子树。
醇>要遍历后序中的非空二进制树,请执行 在每个节点递归执行以下操作:
- 遍历左子树。
- 遍历正确的子树。
- 访问root。
醇>
[顺便说一下,这是第一次搜索。]
答案 2 :(得分:-1)
class BstNode
{
public int data;
public BstNode(int data)
{
this.data = data;
}
public BstNode left;
public BstNode right;
}
class Program
{
public static void PreOrderTraversal(BstNode root)
{
if (root == null) return;
Console.WriteLine("PreOrderTraversal at node {0}", root.data); // process the root
PreOrderTraversal(root.left);// process the left
PreOrderTraversal(root.right);// process the right
}
public static void InOrderTraversal(BstNode root)
{
if (root == null) return;
InOrderTraversal(root.left);// process the left
Console.WriteLine("InOrderTraversal at node {0}", root.data); // process the root
InOrderTraversal(root.right);// process the right
}
public static void PostOrderTraversal(BstNode root)
{
if (root == null) return;
PostOrderTraversal(root.left);// process the left
PostOrderTraversal(root.right);// process the right
Console.WriteLine("PostOrderTraversal at node {0}", root.data); // process the root
}
}