怎么在二叉树中插入一个新的节点?

怎么在二叉树中插入一个新的节点?,第1张

二叉树节点的查找、插入删除.用C语言做的,不懂的地方可以给我留言。希望对你有所帮助!

#include <stdio.h>

#include <stdlib.h>

typedef int elemtype

typedef struct Node

{

elemtype data

struct Node *Lchild

struct Node *Rchild

}TreeNode

typedef TreeNode *bt

int

Search_data(TreeNode *t,TreeNode **p,TreeNode **q, elemtype x) //查找函数

{

int flag=0

*p=NULL

*q=t

while(*q)

{

if (x>(*q)->data)

{

*p=*q

*q=(*q)->Rchild

}

else{

if (x<(*q)->data)

{

*p=*q

*q=(*q)->Lchild

}

else{

flag=1

break

}

}

}

return flag

}

int

InsertNode(TreeNode **t,elemtype x) //插入函数

{

int flag =0

TreeNode *q,*s

TreeNode *p=*t

if (!Search_data(*t,&p,&q,x))

{

s=(TreeNode *)malloc(sizeof(TreeNode))

s->data=x

s->Lchild=NULL

s->Rchild=NULL

flag=1

if(!p) t=s

else{

if(x>p->data)

p->Rchild=s

else

p->Lchild=s

}

}

return flag

}

int

DeleteNode(TreeNode **t,elemtype x) //删除函数

{

int flag=0

TreeNode *q,*s,**f

TreeNode *p=*t

if (Search_data(*t,&p,&q,x))

{

flag=1

if(p==q) f=&(*t)

else

{

f=&(p->Lchild)

if(x>p->data)

f=&(p->Rchild)

}

if(!q->Rchild)

*f=q->Lchild

else{

if(!q->Lchild)

*f=q->Rchild

else{

p=q->Rchild

s=p

while(p->Lchild){

s=p

p=q->Lchild

}

*f=p

p->Lchild=q->Lchild

if (s!=p)

{

s->Lchild=p->Rchild

p->Rchild=q->Rchild

}

}

}

free(q)

}

return flag

}

void

visit(bt t)

{

printf("%c",t->data)

}

TreeNode *

creat_Tree()

{

char ch

bt t

ch=getchar()

if(ch==' ') return (NULL)

else{

t=(TreeNode *)malloc(sizeof(TreeNode))

t->data=ch

t->Lchild=creat_Tree()

t->Rchild=creat_Tree()

printf("%x\n",&t)

return (t)

}

}

void

mid_oderTree(bt t)

{

if (t!=NULL)

{

mid_oderTree(t->Lchild)

visit(t)

mid_oderTree(t->Rchild)

}

}

int

count_leafTree(bt t)

{

int i

if(t==NULL) return 0

else

if(t->Lchild==NULL&&t->Rchild==NULL)

i=1

else i=count_leafTree(t->Lchild)+

count_leafTree(t->Rchild)

return i

}

main()

{

TreeNode *t,*p,*q

elemtype x

x='M'

printf("creat Tree:\n")

//二叉树在遍历最后一个节点之后,遇到结束符结束建立树。

t=creat_Tree()

printf("中根遍历树:\n")

mid_oderTree(t)

printf("\n中根序插入%c成功输出(是1否0):%d\n",x,InsertNode(&t,x))

printf("插入%c后的查找成功输出(是1否0):%d\n",x,Search_data(t,&p,&q, x))

printf("插入后的中根遍历树:\n")

mid_oderTree(t)

printf("\n删除%c成功输出(是1否0):%d \n",x,DeleteNode(&t,x))

printf("删除后的中根遍历树:\n")

mid_oderTree(t)

printf("\n求树的叶子数:%d \n",count_leafTree(t))

}

//先选中节点才能增加节点

import java.awt.*

import java.awt.event.*

import javax.swing.*

import javax.swing.event.*

import javax.swing.tree.*

public class TreeTest implements ActionListener,TreeModelListener{

JLabel label=null

JTree tree=null

DefaultTreeModel treeModel=null

String nodeName=null//原有节点名称

public TreeTest(){

JFrame f=new JFrame("TreeTest")

Container contentPane=f.getContentPane()

DefaultMutableTreeNode root=new DefaultMutableTreeNode("资源管理器")

tree=new JTree(root)

tree.setEditable(true)

tree.addMouseListener(new MouseHandle())

treeModel=(DefaultTreeModel)tree.getModel()

treeModel.addTreeModelListener(this)

JScrollPane scrollPane=new JScrollPane()

scrollPane.setViewportView(tree)

JPanel panel=new JPanel()

JButton b=new JButton("新增节点")

b.addActionListener(this)

panel.add(b)

b=new JButton("删除节点")

b.addActionListener(this)

panel.add(b)

b=new JButton("清除所有节点")

b.addActionListener(this)

panel.add(b)

label=new JLabel("Action")

contentPane.add(panel,BorderLayout.NORTH)

contentPane.add(scrollPane,BorderLayout.CENTER)

contentPane.add(label,BorderLayout.SOUTH)

f.pack()

f.setVisible(true)

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0)

}

})

}

//本方法运行新增、删除、清除所有节点的程序代码.

public void actionPerformed(ActionEvent ae){

if (ae.getActionCommand().equals("新增节点")){

DefaultMutableTreeNode parentNode=null

DefaultMutableTreeNode newNode=new DefaultMutableTreeNode("新节点")

newNode.setAllowsChildren(true)

TreePath parentPath=tree.getSelectionPath()

//取得新节点的父节点

parentNode=(DefaultMutableTreeNode)(parentPath.getLastPathComponent())

//由DefaultTreeModel的insertNodeInto()方法增加新节点

treeModel.insertNodeInto(newNode,parentNode,parentNode.getChildCount())

//tree的scrollPathToVisible()方法在使Tree会自动展开文件夹以便显示所加入的新节点。若没加这行则加入的新节点

//会被 包在文件夹中,你必须自行展开文件夹才看得到。

tree.scrollPathToVisible(new TreePath(newNode.getPath()))

label.setText("新增节点成功")

}

if (ae.getActionCommand().equals("删除节点")){

TreePath treepath=tree.getSelectionPath()

if (treepath!=null){

//下面两行取得选取节点的父节点.

DefaultMutableTreeNode selectionNode=(DefaultMutableTreeNode)treepath.getLastPathComponent()

TreeNode parent=(TreeNode)selectionNode.getParent()

if (parent!=null) {

//由DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点。

treeModel.removeNodeFromParent(selectionNode)

label.setText("删除节点成功")

}

}

}

if (ae.getActionCommand().equals("清除所有节点")){

//下面一行,由DefaultTreeModel的getRoot()方法取得根节点.

DefaultMutableTreeNode rootNode=(DefaultMutableTreeNode)treeModel.getRoot()

//下面一行删除所有子节点.

rootNode.removeAllChildren()

//删除完后务必运行DefaultTreeModel的reload() *** 作,整个Tree的节点才会真正被删除.

treeModel.reload()

label.setText("清除所有节点成功")

}

}

public void treeNodesChanged(TreeModelEvent e){

TreePath treePath=e.getTreePath()

DefaultMutableTreeNode node=(DefaultMutableTreeNode)treePath.getLastPathComponent()

try{

int[] index=e.getChildIndices()

node=(DefaultMutableTreeNode)node.getChildAt(index[0])

}catch(NullPointerException exc){}

label.setText(nodeName+"更改数据为:"+(String)node.getUserObject())

}

public void treeNodesInserted(TreeModelEvent e){

System.out.println("new node insered")

}

public void treeNodesRemoved(TreeModelEvent e){

System.out.println("node deleted")

}

public void treeStructureChanged(TreeModelEvent e){

System.out.println("Structrue changed")

}

public static void main(String[] args){

new TreeTest()

}

class MouseHandle extends MouseAdapter{

public void mousePressed(MouseEvent e){

try{

JTree tree=(JTree)e.getSource()

int rowLocation=tree.getRowForLocation(e.getX(),e.getY())

TreePath treepath=tree.getPathForRow(rowLocation)

TreeNode treenode=(TreeNode)treepath.getLastPathComponent()

nodeName=treenode.toString()

}catch(NullPointerException ne){}

}

}

}

首先打开树控件的属性对话框,添加单击事件如下图 *** 作,

,以上 *** 作会自动向工程中添加单击处理函数如下:

void CXXXXXX::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)

{

// TODO: 在此添加控件通知处理程序代码

CPoint Pos

::GetCursorPos(&Pos)  //获取鼠标点击的位置坐标

CPoint pt(Pos)

m_Treectrol.ScreenToClient(&pt)  //有屏幕坐标转成  控件坐标(树控件的客户区坐标)

HTREEITEM hSelItem = m_Treectrol.HitTest(pt)  //通过HitTest获取单击的子项

CRect rec

m_treeTaskRule.GetItemRect(hSelItem, &rec, TRUE)

if (hSelItem != 0 )//&& rec.PtInRect(pt)         //判断是否单击到子项(注释掉的代码为是否点击到子项区域一般是其文字显示区域)

{

m_Treectrol.SelectItem(hSelItem) //选中点击项

// add your  code

}

*pResult = 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11758921.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存