指定TreeNode排序

本文介绍了一种针对TreeView中TreeNode节点的排序方法,包括基于字符串的简单排序和基于IP地址的复杂排序实现。通过将节点数据转换为List并利用比较器进行排序,最后重新构建排序后的节点结构。

序:网上好多文章都是整个TreeView的排序,而不是一个TreeNode节点的排序,挺费神的。


button1.Click调用: My_SortTreeNode(treeView1.SelectedNode);  //选定的节点,右键可以添加排序弹出菜单

1.String排序:

        public int TreeNodeCompare(TreeNode x, TreeNode y)
        {
            TreeNode tx = x as TreeNode;
            TreeNode ty = y as TreeNode;
            return String.Compare(tx.Text, ty.Text);
        }

        public void My_SortTreeNode(TreeNode cur_Node)
        {
            Comparison<TreeNode> sorterX = new Comparison<TreeNode>(TreeNodeCompare);
            System.Collections.Generic.List<TreeNode> al = new System.Collections.Generic.List<TreeNode>();

            foreach (TreeNode tn in cur_Node.Nodes)
            {
                al.Add(tn);
            }
            al.Sort(sorterX);

            cur_Node.Nodes.Clear();
            foreach (TreeNode tn in al)
            {
                cur_Node.Nodes.Add(tn);
            }
        }

//////

该例子使用了List的排序功能,才好转换;网上写了一些排序的,但都不好用;有的还不成功的。


下一个例子,使用IP地址进行排序,要复杂一点,其他排序功能都可以根据该方法灵活改变一下,即可》》》》

My_SortTreeNode_byIP(treeView_devTree.SelectedNode);

2.IP地址进行排序:

private int CompareIp(string ipx, string ipy)
        {
            string[] ipxs = ipx.Split('.');
            string[] ipys = ipy.Split('.');

            for (int i = 0; i < 4; i++)
            {
                if (Convert.ToInt32(ipxs[i]) > Convert.ToInt32(ipys[i]))
                {
                    return 1;
                }
                else if (Convert.ToInt32(ipxs[i]) < Convert.ToInt32(ipys[i]))
                {
                    return -1;
                }
                else
                {
                    continue;
                }
            }
            return 0;
        }


        public void My_SortTreeNode_byIP(TreeNode cur_Node)
        {
            Comparison<string> sorterIp = new Comparison<string>(CompareIp);
            System.Collections.Generic.List<string> al = new System.Collections.Generic.List<string>();

            Shawn.WL.WanLongPannel.datadef.DeviceSt devInfo;
            string groupName = cur_Node.Name;

            foreach (TreeNode tn in cur_Node.Nodes)
            {
                Error_devMan_e rslt = devMann.DeviceSeek(treeView_devTree.SelectedNode.Name, tn.Text, out devInfo);
                if (rslt == Error_devMan_e.OK)
                {
                    al.Add(devInfo.net.ipStr);
                }
                else
                {
                    MsgShowError(ErrMsgFromEnum(rslt));
                }
            }

            al.Sort(sorterIp);

            GroupSt tmpGroup = new GroupSt();
            tmpGroup.name = treeView_devTree.SelectedNode.Name;
            tmpGroup.devList = new System.Collections.ArrayList();

            TreeNode tn_tmp = new TreeNode();
            foreach (string sIP in al)
            {
                foreach (TreeNode tn in cur_Node.Nodes)
                {
                    Error_devMan_e rslt = devMann.DeviceSeek(treeView_devTree.SelectedNode.Name, tn.Text, out devInfo);
                    if (sIP == devInfo.net.ipStr && tn.Text == devInfo.name)
                    {
                        TreeNode tn_sub = (TreeNode)tn.Clone();
                        tn_tmp.Nodes.Add(tn_sub);

                        tmpGroup.devList.Add(devInfo);
                        break;
                    }
                }

            }
            cur_Node.Nodes.Clear();
            foreach (TreeNode childNode in tn_tmp.Nodes)
            {
                cur_Node.Nodes.Add(childNode);
            }


        }


17:10 2017/8/10


代码自主完成率,现平台提交代码时,禁用粘贴功能。 大家可以在页面中直接编写代码,运行测试。当然也可以在codeblock中编好代码,代码成功后,在输入到页面提交。运行错误后,点击edit可以重新编辑。允许将自己的代码复制出去,在codeblock中进一步运行调试。 问题 A: 二叉搜索树的最近公共祖先(Leetcode)-DS 时间限制: 1 Sec 内存限制: 128 MB 提交: 0 解决: 22 [提交][状态][讨论版][命题人:4358] 题目描述 给定一棵二叉排序树(又称二叉搜索树),要求找到该树中两个指定结点的最近公共祖先。最近公共祖先的定义:对于有根树 T 的两个结点 p 和 q,最近公共祖先为一个结点 x,满足 x 是 p 和 q 的祖先且 x 的深度尽可能大,p 和 q 中的一个结点也可以是自己的祖先。 PS:代码填空 #include<iostream> #include<stdlib.h> using namespace std; struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* find(struct TreeNode* node,int value) {//根据结点值递归查找相应结点 //pdsu-c1 //pdsu-c1 } struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {//查找二叉搜索树的最近公共祖先 //pdsu-c2 //pdsu-c2 } int Insert(struct TreeNode** T, int e) {//在二叉排序树中插入结点 //如果当前子树为空,创建子树的根结点。 //pdsu-c3 //pdsu-c3 } void CreateBST(struct TreeNode** T, int* arr, int len) {//创建二叉排序树 //pdsu-c4 //pdsu-c4 } int main() { int n,arr[100],a,b; //输入二叉排序树结点个数 cin>>n; //分别输入二叉排序树结点值 for(int i=0;i<n;i++) cin>>arr[i]; struct TreeNode* T; CreateBST(&T,arr,n); //创建二叉排序树 //分别输入两个结点 cin>>a>>b; struct TreeNode* ans; struct TreeNode* p; struct TreeNode* q; p=find(T,a); //获取结点p q=find(T,b); //获取结点q ans=lowestCommonAncestor(T,p,q); cout<<"p和q的最近公共结点为:"<<ans->val<<endl; return 0; } 输入描述 第一行一个整数n代表节点个数 第二行n个整数代表二叉排序树结点值 第三行两个整数代表两个指定的节点 输出描述 一行先输出文字说明(主函数已经实现),再输出两个点的最近公共祖先 样例输入 9 6 2 8 0 4 7 9 3 5 2 8 样例输出 p和q的最近公共结点为:6 代码填空: #include<iostream> #include<stdlib.h> using namespace std; struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* find(struct TreeNode* node,int value) {//根据结点值递归查找相应结点 //pdsu-c1 //pdsu-c1 } struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {//查找二叉搜索树的最近公共祖先 //pdsu-c2 //pdsu-c2 } int Insert(struct TreeNode** T, int e) {//在二叉排序树中插入结点 //如果当前子树为空,创建子树的根结点。 //pdsu-c3 //pdsu-c3 } void CreateBST(struct TreeNode** T, int* arr, int len) {//创建二叉排序树 //pdsu-c4 //pdsu-c4 } int main() { int n,arr[100],a,b; //输入二叉排序树结点个数 cin>>n; //分别输入二叉排序树结点值 for(int i=0;i<n;i++) cin>>arr[i]; struct TreeNode* T; CreateBST(&T,arr,n); //创建二叉排序树 //分别输入两个结点 cin>>a>>b; struct TreeNode* ans; struct TreeNode* p; struct TreeNode* q; p=find(T,a); //获取结点p q=find(T,b); //获取结点q ans=lowestCommonAncestor(T,p,q); cout<<"p和q的最近公共结点为:"<<ans->val<<endl; return 0; } 提示 输入:\(root = [6, 2, 8, 0, 4, 7, 9, NULL, NULL, 3, 5]\),\(p = 2\),\(q = 8\) 该二叉排序树如图 7.57 所示。 输出:6 解释:结点 2 和结点 8 的最近公共祖先是结点 6。
最新发布
12-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值