我来联谊——以武会友(智解二叉树)
<p>这是我几年上学时想到的问题。</p><p>二叉树的性质有很多,其中一个是对给定先中序的二叉树,其结构只能唯一。</p>
<p>我就不信,后来写了个程序还真是如此。</p>
<p>这题就是,将给定的遍历顺序的二叉树图打出来,以便查验。</p>
<p>前a,c,d</p>
<p>后c,a,d</p>
<p> </p>
<p> </p>
<p>我不把窍门说出来也许有人以为我胡侃。</p>
<p>1节点不定,一定用递归。</p>
<p>2不指定头节点的名称一定是a.可能是字串序列里的任一个。也就是说,确定头节点的是某名称在别的序列里的相对位置。</p>
<p>3推荐使用access数据库,在新机器上不用装。sql之类没必要。喜欢文件的也可以用文件。</p>
<p> </p>
<p>我写这个2,3天。</p>
<p><font face="Verdana">来信请回 wangyingshi19850612@126.com<br/>专用net c#</font></p> 算法我是七窍通了六窍,呵呵~~~~ <p>还没学...百度了一个,嘿嘿</p>
<p> </p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>'二叉树的结点类 <br/>Option Explicit <br/>Private mNodeValue As String '结点值 <br/>Private mLeftNode As clsBiTreeNode '左结点 <br/>Private mRightNode As clsBiTreeNode '右结点 <br/><br/>'得到结点的值 <br/>Public Property Get NodeValue() As String <br/>NodeValue = mNodeValue <br/>End Property <br/><br/>'设置结点的值 <br/>Public Property Let NodeValue(ByVal pNodeValue As String) <br/>mNodeValue = pNodeValue <br/>End Property <br/><br/>'得到左结点 <br/>Public Property Get LeftNode() As clsBiTreeNode <br/>Set LeftNode = mLeftNode <br/>End Property <br/><br/>'设置左结点 <br/>Public Property Let LeftNode(ByVal pLeftNode As clsBiTreeNode) <br/>Set mLeftNode = pLeftNode <br/>End Property <br/><br/>'得到右结点 <br/>Public Property Get RightNode() As clsBiTreeNode <br/>Set RightNode = mRightNode <br/>End Property <br/><br/>'设置右结点 <br/>Public Property Let RightNode(ByVal pRightNode As clsBiTreeNode) <br/>Set mRightNode = pRightNode <br/>End Property <br/><br/>----------------------- <br/>'一个二叉树的类 <br/>Option Explicit <br/>Private mRoot As clsBiTreeNode <br/><br/>'建立一棵二叉树,同时以strValue为值建立根结点 <br/>Public Sub CreateTree(strValue As String) <br/>Set mRoot = New clsBiTreeNode <br/>mRoot.NodeValue = strValue <br/>End Sub <br/><br/>'求二叉树的根结点 <br/>Public Function Root() As clsBiTreeNode <br/>Set Root = mRoot <br/>End Function <br/><br/>'求二叉树中值为strValue的结点的双亲 <br/>Public Function Parent(strValue As String) As clsBiTreeNode <br/>Dim NodeTemp As clsBiTreeNode <br/>FindNode mRoot, strValue, NodeTemp <br/>Set Parent = NodeTemp <br/>End Function <br/><br/>'求二叉树T中值为strValue的结点的左孩子 <br/>Public Function LeftChild(strValue As String) As clsBiTreeNode <br/>Dim NodeTemp As clsBiTreeNode <br/>Set LeftChild = Nothing <br/>Set NodeTemp = FindNode(mRoot, strValue) <br/>If Not NodeTemp Is Nothing Then Set LeftChild = NodeTemp.LeftNode <br/>End Function <br/><br/>'求二叉树T中值为strValue的结点的右孩子 <br/>Public Function RightChild(strValue As String) As clsBiTreeNode <br/>Dim NodeTemp As clsBiTreeNode <br/>Set RightChild = Nothing <br/>Set NodeTemp = FindNode(mRoot, strValue) <br/>If Not NodeTemp Is Nothing Then Set RightChild = NodeTemp.RightNode <br/>End Function <br/><br/>'遍历二叉树:采用前序遍历******************* <br/>Public Sub TraverseF(ByRef Node As clsBiTreeNode) <br/>If Node Is Nothing Then Exit Sub <br/>Debug.Print Node.NodeValue & ":" <br/>Traverse Node.LeftNode <br/>Traverse Node.RightNode <br/>End Sub <br/><br/>'遍历二叉树:采用中序遍历***************** <br/>Public Sub TraverseM(ByRef Node As clsBiTreeNode) <br/>If Node Is Nothing Then Exit Sub <br/>Traverse Node.LeftNode <br/>Debug.Print Node.NodeValue & ":" <br/>Traverse Node.RightNode <br/>End Sub <br/><br/>'遍历二叉树:采用后序遍历*************** <br/>Public Sub TraverseB(ByRef Node As clsBiTreeNode) <br/>If Node Is Nothing Then Exit Sub <br/>Traverse Node.LeftNode <br/>Traverse Node.RightNode <br/>Debug.Print Node.NodeValue & ":" <br/>End Sub <br/><br/>'查找值为strValue的(第一个)结点:采用前序遍历 <br/>'参数说明: <br/>'Node为树的根结点 <br/>'strValue要查找的结点的值 <br/>'myParentNode为要查找的结点的双亲结点 <br/>'pParentNode为第一个参数Node结点的双亲结点,是为了保存双亲结点而设置 <br/>Private Function FindNode(ByRef Node As clsBiTreeNode, ByVal strValue As String, Optional ByRef myParentNode As clsBiTreeNode, Optional ByRef pParentNode As clsBiTreeNode) As clsBiTreeNode <br/>Dim NodeTemp As clsBiTreeNode <br/>Set FindNode = Nothing <br/>'如果为空则退出 <br/>If Node Is Nothing Then <br/>Exit Function <br/>End If <br/>If Node.NodeValue = strValue Then <br/>Set FindNode = Node <br/>Set myParentNode = pParentNode <br/>Exit Function <br/>Else <br/>Set NodeTemp = FindNode(Node.LeftNode, strValue, myParentNode, Node) <br/>If Not NodeTemp Is Nothing Then <br/>Set FindNode = NodeTemp <br/>Set pParentNode = Node <br/>Exit Function <br/>End If <br/>Set NodeTemp = FindNode(Node.RightNode, strValue, myParentNode, Node) <br/>If Not NodeTemp Is Nothing Then <br/>Set FindNode = NodeTemp <br/>Set pParentNode = Node <br/>Exit Function <br/>End If <br/>End If <br/>End Function <br/><br/>'在二叉树中,将值为strChild的结点作为值为strParetn的结点的左孩子插入:返回""表示成功,否则返回错误信息 <br/>Public Function AddLeftChild(ByVal strParent As String, ByVal strChild As String) As String <br/>Dim NodeTemp As clsBiTreeNode <br/>AddLeftChild = "" <br/>Set NodeTemp = FindNode(mRoot, strParent) <br/>If NodeTemp Is Nothing Then <br/>AddLeftChild = "没有找到值为" & strParent & "的结点" <br/>End If <br/>If NodeTemp.LeftNode Is Nothing Then <br/>Dim NewNode As New clsBiTreeNode <br/>NewNode.NodeValue = strChild <br/>NodeTemp.LeftNode = NewNode <br/>Else <br/>AddLeftChild = "值为" & strParent & "的结点的左结点已经存在" <br/>End If <br/><br/>End Function <br/><br/><br/>'在二叉树中,将值为strChild的结点作为值为strParetn的结点的右孩子插入:返回""表示成功,否则返回错误信息 <br/>Public Function AddRightChild(ByVal strParent As String, ByVal strChild As String) As String <br/>Dim NodeTemp As clsBiTreeNode <br/>AddRightChild = "" <br/>Set NodeTemp = FindNode(mRoot, strParent) <br/>If NodeTemp Is Nothing Then <br/>AddRightChild = "没有找到值为" & strParent & "的结点" <br/>End If <br/>If NodeTemp.RightNode Is Nothing Then <br/>Dim NewNode As New clsBiTreeNode <br/>NewNode.NodeValue = strChild <br/>NodeTemp.RightNode = NewNode <br/>Else <br/>AddRightChild = "值为" & strParent & "的结点的右结点已经存在" <br/>End If <br/><br/>End Function <br/><br/>'在二叉树中,删除值为strValue的结点的左孩子:返回""表示成功,否则返回错误信息 <br/>Public Function DelLeftChild(ByVal strValue As String) As String <br/>Dim NodeTemp As clsBiTreeNode <br/>DelLeftChild = "" <br/>Set NodeTemp = FindNode(mRoot, strValue) <br/>If NodeTemp Is Nothing Then <br/>DelLeftChild = "没有找到值为" & strValue & "的结点" <br/>End If <br/>If Not NodeTemp.LeftNode Is Nothing Then <br/>NodeTemp.LeftNode = Nothing <br/>End If <br/><br/>End Function <br/><br/>'在二叉树中,删除值为strValue的结点的右孩子:返回""表示成功,否则返回错误信息 <br/>Public Function DelRightChild(ByVal strValue As String) As String <br/>Dim NodeTemp As clsBiTreeNode <br/>DelRightChild = "" <br/>Set NodeTemp = FindNode(mRoot, strValue) <br/>If NodeTemp Is Nothing Then <br/>DelRightChild = "没有找到值为" & strValue & "的结点" <br/>End If <br/>If Not NodeTemp.RightNode Is Nothing Then <br/>NodeTemp.RightNode = Nothing <br/>End If <br/><br/>End Function </p></blockquote> 帮你顶一下
页:
[1]