二叉树排序及二叉树节点的增删改查(java实现)

**

此处为二叉树节点类

**

package search.binaryTreeSearch;
/**
 * 二叉树节点
 * @author jeker-chen
 *
 */
public class Node {
    int data;
    Node leftNode ;
    Node rightNode ;
    public Node(int data, Node leftNode, Node rightNode) {
        super();
        this.data = data;
        this.leftNode = leftNode;
        this.rightNode = rightNode;
    }
    public Node() {
        super();
    }
    public Node(int data) {
        super();
        this.data = data;
    }


}

**

二叉排序树类

**

package search.binaryTreeSearch;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * 二叉树类
 * 
 * @author jeker-chen
 *
 */
public class BinaryTree {
    private static Node orignNode = new Node();

    /**
     * 插入节点
     * 
     * @param 要插入的节点
     * @param orign
     *            目标节点
     */
    public void InsertTree(Node node, Node orign) {
        if (node.data < orign.data) {
            if (orign.leftNode != null) {
                InsertTree(node, orign.leftNode);
            } else {
                orign.leftNode = new Node(node.data);
            }
        } else if (node.data > orign.data) {
            if (orign.rightNode != null) {
                InsertTree(node, orign.rightNode);
            } else {
                orign.rightNode = new Node(node.data);
            }
        } else {
            // do nothing
        }
    }

    /**
     * 二叉树查找
     * 
     * @param mubiao
     *            所要查找的数据
     * @param orign
     *            二叉树的根节点
     */
    public Map<Node, Node> searchNode(int mubiao, Node orign, Node father) {
        if (orign == null) {
            System.out.println("查找节点不存在!");
            return null;
        }
        if (orign.data == mubiao) {
            Map<Node, Node> map = new HashMap<>();
            map.put(orign, father);
            return map;
        } else if (orign.data < mubiao) {
            return searchNode(mubiao, orign.rightNode, orign);
        } else {
            return searchNode(mubiao, orign.leftNode, orign);
        }
    }

    /**
     * 删除二叉树中指定的元素
     * 
     * @param orign
     *            二叉树根节点
     * @param mubiao
     *            索要删除节点的数据
     */
    public void deleteNode(Map<Node, Node> nodeMap) {
        Node mubiao = nodeMap.keySet().iterator().next();
        Node father = nodeMap.get(mubiao);
        // 若不存在左子树
        if (mubiao.leftNode == null) {
            // 将右子节点的数据赋值给目标节点
            if (father.leftNode == mubiao) {
                father.leftNode = mubiao.rightNode;
            } else {
                father.rightNode = mubiao.rightNode;
            }
        } else if (mubiao.rightNode == null) {
            if (father.leftNode == mubiao) {
                father.leftNode = mubiao.leftNode;
            } else {
                father.rightNode = mubiao.leftNode;
            }
        } else {
            Node left = mubiao.leftNode;
            if (left.rightNode == null) {
                father.leftNode = mubiao.leftNode;
                mubiao = null;
            } else {
                father = left;
                // 获得目标节点相邻节点
                while (left.rightNode != null) {
                    father = left;
                    left = left.rightNode;
                }
                mubiao.data = left.data;
                father.rightNode = null;
            }
        }
    }

    public Node Create(List<Integer> integers) {
        for (int i = 0; i < integers.size(); i++) {
            if (i == 0) {
                orignNode.data = integers.get(i);
            } else {
                Node node = new Node(integers.get(i));
                InsertTree(node, orignNode);
            }
        }
        return orignNode;
    }

    /*
     * 前序遍历二叉树的节点
     */
    public void preorderTraversal(Node T, int level) {
        if (T != null) {
            System.out.println(T.data + "在第" + level + "层");
            preorderTraversal(T.leftNode, level + 1);
            preorderTraversal(T.rightNode, level + 1);
        }
    }

    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        List<Integer> integers = new LinkedList<>();
        integers.add(5);
        integers.add(7);
        integers.add(3);
        integers.add(1);
        integers.add(2);
        integers.add(6);
        integers.add(4);

        binaryTree.Create(integers);
        binaryTree.preorderTraversal(orignNode, 0);
        System.out.println("=====================");
        Map<Node, Node> nodeMap = binaryTree.searchNode(1, orignNode, orignNode);
        // System.out.println(node.data);
        System.out.println(nodeMap.keySet().iterator().next().data);
        System.out.println(nodeMap.get(nodeMap.keySet().iterator().next()).data);
        binaryTree.deleteNode(nodeMap);
        binaryTree.preorderTraversal(orignNode, 0);

    }

}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是二叉树增删改查的C语言代码示例。 首先,我们需要定义二叉树的结构体: ```c struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; ``` 接下来,我们分别实现二叉树的增、删、改、查操作: 1. 增加节点 ```c struct TreeNode* insertNode(struct TreeNode* root, int val) { if (!root) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } if (val < root->val) { root->left = insertNode(root->left, val); } else if (val > root->val) { root->right = insertNode(root->right, val); } return root; } ``` 2. 删除节点 ```c struct TreeNode* deleteNode(struct TreeNode* root, int key) { if (!root) { return NULL; } if (root->val == key) { if (!root->left) { struct TreeNode* tmp = root->right; free(root); return tmp; } else if (!root->right) { struct TreeNode* tmp = root->left; free(root); return tmp; } else { struct TreeNode* p = root->right; while (p->left) { p = p->left; } root->val = p->val; root->right = deleteNode(root->right, p->val); } } else if (root->val > key) { root->left = deleteNode(root->left, key); } else { root->right = deleteNode(root->right, key); } return root; } ``` 3. 修改节点 ```c struct TreeNode* modifyNode(struct TreeNode* root, int oldVal, int newVal) { root = deleteNode(root, oldVal); root = insertNode(root, newVal); return root; } ``` 4. 查找节点 ```c struct TreeNode* searchNode(struct TreeNode* root, int val) { if (!root || root->val == val) { return root; } if (root->val > val) { return searchNode(root->left, val); } else { return searchNode(root->right, val); } } ``` 以上就是二叉树增删改查的C语言代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值